Skip to content

Commit 8b23a46

Browse files
committed
feat: add solutions to lc problems: No.2465~2468
* No.2465.Number of Distinct Averages * No.2466.Count Ways To Build Good Strings * No.2467.Most Profitable Path in a Tree * No.2468.Split Message Based on Limit
1 parent 5630668 commit 8b23a46

File tree

24 files changed

+1375
-7
lines changed

24 files changed

+1375
-7
lines changed

solution/2400-2499/2465.Number of Distinct Averages/README.md

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,22 +61,71 @@
6161

6262
<!-- 这里可写通用的实现逻辑 -->
6363

64+
**方法一:排序 + 哈希表**
65+
66+
我们先对数组进行排序,然后遍历数组,将 $nums[i]$ 与 $nums[n-i-1]$ 求和后放入哈希表中,最后返回哈希表的大小即可。
67+
68+
时间复杂度 $O(n\times \log n)$,空间复杂度 $O(n)$。其中 $n$ 为数组的长度。
69+
6470
<!-- tabs:start -->
6571

6672
### **Python3**
6773

6874
<!-- 这里可写当前语言的特殊实现逻辑 -->
6975

7076
```python
71-
77+
class Solution:
78+
def distinctAverages(self, nums: List[int]) -> int:
79+
n = len(nums)
80+
nums.sort()
81+
return len(set(nums[i] + nums[n - i - 1] for i in range(n >> 1)))
7282
```
7383

7484
### **Java**
7585

7686
<!-- 这里可写当前语言的特殊实现逻辑 -->
7787

7888
```java
89+
class Solution {
90+
public int distinctAverages(int[] nums) {
91+
Arrays.sort(nums);
92+
int n = nums.length;
93+
Set<Integer> s = new HashSet<>();
94+
for (int i = 0; i < n >> 1; ++i) {
95+
s.add(nums[i] + nums[n - i - 1]);
96+
}
97+
return s.size();
98+
}
99+
}
100+
```
101+
102+
### **C++**
103+
104+
```cpp
105+
class Solution {
106+
public:
107+
int distinctAverages(vector<int>& nums) {
108+
sort(nums.begin(), nums.end());
109+
int n = nums.size();
110+
unordered_set<int> s;
111+
for (int i = 0; i < n >> 1; ++i) s.insert(nums[i] + nums[n - i - 1]);
112+
return s.size();
113+
}
114+
};
115+
```
79116
117+
### **Go**
118+
119+
```go
120+
func distinctAverages(nums []int) int {
121+
sort.Ints(nums)
122+
n := len(nums)
123+
s := map[int]struct{}{}
124+
for i := 0; i < n>>1; i++ {
125+
s[nums[i]+nums[n-i-1]] = struct{}{}
126+
}
127+
return len(s)
128+
}
80129
```
81130

82131
### **TypeScript**

solution/2400-2499/2465.Number of Distinct Averages/README_EN.md

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,56 @@ There is only one average to be calculated after removing 1 and 100, so we retur
6262
### **Python3**
6363

6464
```python
65-
65+
class Solution:
66+
def distinctAverages(self, nums: List[int]) -> int:
67+
n = len(nums)
68+
nums.sort()
69+
return len(set(nums[i] + nums[n - i - 1] for i in range(n >> 1)))
6670
```
6771

6872
### **Java**
6973

7074
```java
75+
class Solution {
76+
public int distinctAverages(int[] nums) {
77+
Arrays.sort(nums);
78+
int n = nums.length;
79+
Set<Integer> s = new HashSet<>();
80+
for (int i = 0; i < n >> 1; ++i) {
81+
s.add(nums[i] + nums[n - i - 1]);
82+
}
83+
return s.size();
84+
}
85+
}
86+
```
87+
88+
### **C++**
89+
90+
```cpp
91+
class Solution {
92+
public:
93+
int distinctAverages(vector<int>& nums) {
94+
sort(nums.begin(), nums.end());
95+
int n = nums.size();
96+
unordered_set<int> s;
97+
for (int i = 0; i < n >> 1; ++i) s.insert(nums[i] + nums[n - i - 1]);
98+
return s.size();
99+
}
100+
};
101+
```
71102
103+
### **Go**
104+
105+
```go
106+
func distinctAverages(nums []int) int {
107+
sort.Ints(nums)
108+
n := len(nums)
109+
s := map[int]struct{}{}
110+
for i := 0; i < n>>1; i++ {
111+
s[nums[i]+nums[n-i-1]] = struct{}{}
112+
}
113+
return len(s)
114+
}
72115
```
73116

74117
### **TypeScript**
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class Solution {
2+
public:
3+
int distinctAverages(vector<int>& nums) {
4+
sort(nums.begin(), nums.end());
5+
int n = nums.size();
6+
unordered_set<int> s;
7+
for (int i = 0; i < n >> 1; ++i) s.insert(nums[i] + nums[n - i - 1]);
8+
return s.size();
9+
}
10+
};
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
func distinctAverages(nums []int) int {
2+
sort.Ints(nums)
3+
n := len(nums)
4+
s := map[int]struct{}{}
5+
for i := 0; i < n>>1; i++ {
6+
s[nums[i]+nums[n-i-1]] = struct{}{}
7+
}
8+
return len(s)
9+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class Solution {
2+
public int distinctAverages(int[] nums) {
3+
Arrays.sort(nums);
4+
int n = nums.length;
5+
Set<Integer> s = new HashSet<>();
6+
for (int i = 0; i < n >> 1; ++i) {
7+
s.add(nums[i] + nums[n - i - 1]);
8+
}
9+
return s.size();
10+
}
11+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class Solution:
2+
def distinctAverages(self, nums: List[int]) -> int:
3+
n = len(nums)
4+
nums.sort()
5+
return len(set(nums[i] + nums[n - i - 1] for i in range(n >> 1)))

solution/2400-2499/2466.Count Ways To Build Good Strings/README.md

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,135 @@
5151

5252
<!-- 这里可写通用的实现逻辑 -->
5353

54+
**方法一:记忆化搜索**
55+
56+
我们设计一个函数 $dfs(i)$ 表示从第 $i$ 位开始构造的好字符串的个数,答案即为 $dfs(0)$。
57+
58+
函数 $dfs(i)$ 的计算过程如下:
59+
60+
- 如果 $i \gt high$,返回 $0$;
61+
- 如果 $ low \leq i \leq high$,答案累加 $1$,然后 $i$ 之后既可以添加 `zero` 个 $0$,也可以添加 `one` 个 $1$,因此答案累加上 $dfs(i + zero) + dfs(i + one)$。
62+
63+
过程中,我们需要对答案取模,并且可以使用记忆化搜索减少重复计算。
64+
65+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n = high$。
66+
5467
<!-- tabs:start -->
5568

5669
### **Python3**
5770

5871
<!-- 这里可写当前语言的特殊实现逻辑 -->
5972

6073
```python
61-
74+
class Solution:
75+
def countGoodStrings(self, low: int, high: int, zero: int, one: int) -> int:
76+
@cache
77+
def dfs(i):
78+
if i > high:
79+
return 0
80+
ans = 0
81+
if low <= i <= high:
82+
ans += 1
83+
ans += dfs(i + zero) + dfs(i + one)
84+
return ans % mod
85+
86+
mod = 10**9 + 7
87+
return dfs(0)
6288
```
6389

6490
### **Java**
6591

6692
<!-- 这里可写当前语言的特殊实现逻辑 -->
6793

6894
```java
95+
class Solution {
96+
private static final int MOD = (int) 1e9 + 7;
97+
private int[] f;
98+
private int lo;
99+
private int hi;
100+
private int zero;
101+
private int one;
102+
103+
public int countGoodStrings(int low, int high, int zero, int one) {
104+
f = new int[high + 1];
105+
Arrays.fill(f, -1);
106+
lo = low;
107+
hi = high;
108+
this.zero = zero;
109+
this.one = one;
110+
return dfs(0);
111+
}
112+
113+
private int dfs(int i) {
114+
if (i > hi) {
115+
return 0;
116+
}
117+
if (f[i] != -1) {
118+
return f[i];
119+
}
120+
long ans = 0;
121+
if (i >= lo && i <= hi) {
122+
++ans;
123+
}
124+
ans += dfs(i + zero) + dfs(i + one);
125+
ans %= MOD;
126+
f[i] = (int) ans;
127+
return f[i];
128+
}
129+
}
130+
```
131+
132+
### **C++**
133+
134+
```cpp
135+
class Solution {
136+
public:
137+
const int mod = 1e9 + 7;
138+
139+
int countGoodStrings(int low, int high, int zero, int one) {
140+
vector<int> f(high + 1, -1);
141+
function<int(int)> dfs = [&](int i) -> int {
142+
if (i > high) return 0;
143+
if (f[i] != -1) return f[i];
144+
long ans = i >= low && i <= high;
145+
ans += dfs(i + zero) + dfs(i + one);
146+
ans %= mod;
147+
f[i] = ans;
148+
return ans;
149+
};
150+
return dfs(0);
151+
}
152+
};
153+
```
69154

155+
### **Go**
156+
157+
```go
158+
func countGoodStrings(low int, high int, zero int, one int) int {
159+
f := make([]int, high+1)
160+
for i := range f {
161+
f[i] = -1
162+
}
163+
const mod int = 1e9 + 7
164+
var dfs func(i int) int
165+
dfs = func(i int) int {
166+
if i > high {
167+
return 0
168+
}
169+
if f[i] != -1 {
170+
return f[i]
171+
}
172+
ans := 0
173+
if i >= low && i <= high {
174+
ans++
175+
}
176+
ans += dfs(i+zero) + dfs(i+one)
177+
ans %= mod
178+
f[i] = ans
179+
return ans
180+
}
181+
return dfs(0)
182+
}
70183
```
71184

72185
### **TypeScript**

0 commit comments

Comments
 (0)