Skip to content

Commit 93f381b

Browse files
committed
feat: add solutions to lc problem: No.0910
No.0910.Smallest Range II
1 parent 2c26ee9 commit 93f381b

File tree

9 files changed

+251
-53
lines changed

9 files changed

+251
-53
lines changed

solution/0800-0899/0894.All Possible Full Binary Trees/README.md

+14-17
Original file line numberDiff line numberDiff line change
@@ -146,26 +146,23 @@ class Solution {
146146
*/
147147
class Solution {
148148
public:
149-
unordered_map<int, vector<TreeNode*>> f;
150-
151149
vector<TreeNode*> allPossibleFBT(int n) {
152-
return dfs(n);
153-
}
154-
155-
vector<TreeNode*> dfs(int n) {
156-
if (f.count(n)) return f[n];
157-
if (n == 1) return {new TreeNode()};
158-
vector<TreeNode*> res;
159-
for (int i = 0; i < n - 1; ++i) {
160-
int j = n - i - 1;
161-
for (auto left : dfs(i)) {
162-
for (auto right : dfs(j)) {
163-
res.push_back(new TreeNode(0, left, right));
150+
vector<TreeNode*> f[21];
151+
function<vector<TreeNode*>(int)> dfs = [&](int n) -> vector<TreeNode*> {
152+
if (f[n].size()) return f[n];
153+
if (n == 1) return vector<TreeNode*>{new TreeNode()};
154+
vector<TreeNode*> res;
155+
for (int i = 0; i < n - 1; ++i) {
156+
int j = n - i - 1;
157+
for (auto left : dfs(i)) {
158+
for (auto right : dfs(j)) {
159+
res.push_back(new TreeNode(0, left, right));
160+
}
164161
}
165162
}
166-
}
167-
f[n] = res;
168-
return res;
163+
return f[n] = res;
164+
};
165+
return dfs(n);
169166
}
170167
};
171168
```

solution/0800-0899/0894.All Possible Full Binary Trees/README_EN.md

+14-17
Original file line numberDiff line numberDiff line change
@@ -126,26 +126,23 @@ class Solution {
126126
*/
127127
class Solution {
128128
public:
129-
unordered_map<int, vector<TreeNode*>> f;
130-
131129
vector<TreeNode*> allPossibleFBT(int n) {
132-
return dfs(n);
133-
}
134-
135-
vector<TreeNode*> dfs(int n) {
136-
if (f.count(n)) return f[n];
137-
if (n == 1) return {new TreeNode()};
138-
vector<TreeNode*> res;
139-
for (int i = 0; i < n - 1; ++i) {
140-
int j = n - i - 1;
141-
for (auto left : dfs(i)) {
142-
for (auto right : dfs(j)) {
143-
res.push_back(new TreeNode(0, left, right));
130+
vector<TreeNode*> f[21];
131+
function<vector<TreeNode*>(int)> dfs = [&](int n) -> vector<TreeNode*> {
132+
if (f[n].size()) return f[n];
133+
if (n == 1) return vector<TreeNode*>{new TreeNode()};
134+
vector<TreeNode*> res;
135+
for (int i = 0; i < n - 1; ++i) {
136+
int j = n - i - 1;
137+
for (auto left : dfs(i)) {
138+
for (auto right : dfs(j)) {
139+
res.push_back(new TreeNode(0, left, right));
140+
}
144141
}
145142
}
146-
}
147-
f[n] = res;
148-
return res;
143+
return f[n] = res;
144+
};
145+
return dfs(n);
149146
}
150147
};
151148
```

solution/0800-0899/0894.All Possible Full Binary Trees/Solution.cpp

+14-17
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,22 @@
1111
*/
1212
class Solution {
1313
public:
14-
unordered_map<int, vector<TreeNode*>> f;
15-
1614
vector<TreeNode*> allPossibleFBT(int n) {
17-
return dfs(n);
18-
}
19-
20-
vector<TreeNode*> dfs(int n) {
21-
if (f.count(n)) return f[n];
22-
if (n == 1) return {new TreeNode()};
23-
vector<TreeNode*> res;
24-
for (int i = 0; i < n - 1; ++i) {
25-
int j = n - i - 1;
26-
for (auto left : dfs(i)) {
27-
for (auto right : dfs(j)) {
28-
res.push_back(new TreeNode(0, left, right));
15+
vector<TreeNode*> f[21];
16+
function<vector<TreeNode*>(int)> dfs = [&](int n) -> vector<TreeNode*> {
17+
if (f[n].size()) return f[n];
18+
if (n == 1) return vector<TreeNode*>{new TreeNode()};
19+
vector<TreeNode*> res;
20+
for (int i = 0; i < n - 1; ++i) {
21+
int j = n - i - 1;
22+
for (auto left : dfs(i)) {
23+
for (auto right : dfs(j)) {
24+
res.push_back(new TreeNode(0, left, right));
25+
}
2926
}
3027
}
31-
}
32-
f[n] = res;
33-
return res;
28+
return f[n] = res;
29+
};
30+
return dfs(n);
3431
}
3532
};

solution/0900-0999/0910.Smallest Range II/README.md

+78-1
Original file line numberDiff line numberDiff line change
@@ -57,22 +57,99 @@
5757

5858
<!-- 这里可写通用的实现逻辑 -->
5959

60+
**方法一:贪心 + 枚举**
61+
62+
根据题目要求,我们需要求数组中的元素最大值与最小值差值的最小值。每个元素可以加上或者减去 $k$,因此我们可以将数组中的元素分为两部分,一部分加上 $k$,一部分减去 $k$。那么,我们应该将数组中的较大值减去 $k$,较小值加上 $k$,这样才能保证最大值与最小值的差值最小。
63+
64+
因此,我们可以先将数组排序,然后枚举数组中的每个元素,将其分为两部分,一部分加上 $k$,一部分减去 $k$,并计算最大值与最小值的差值。最后,取所有差值中的最小值即可。
65+
66+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 为数组的长度。
67+
6068
<!-- tabs:start -->
6169

6270
### **Python3**
6371

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

6674
```python
67-
75+
class Solution:
76+
def smallestRangeII(self, nums: List[int], k: int) -> int:
77+
nums.sort()
78+
ans = nums[-1] - nums[0]
79+
for i in range(1, len(nums)):
80+
mi = min(nums[0] + k, nums[i] - k)
81+
mx = max(nums[i - 1] + k, nums[-1] - k)
82+
ans = min(ans, mx - mi)
83+
return ans
6884
```
6985

7086
### **Java**
7187

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

7490
```java
91+
class Solution {
92+
public int smallestRangeII(int[] nums, int k) {
93+
Arrays.sort(nums);
94+
int n = nums.length;
95+
int ans = nums[n - 1] - nums[0];
96+
for (int i = 1; i < n; ++i) {
97+
int mi = Math.min(nums[0] + k, nums[i] - k);
98+
int mx = Math.max(nums[i - 1] + k, nums[n - 1] - k);
99+
ans = Math.min(ans, mx - mi);
100+
}
101+
return ans;
102+
}
103+
}
104+
```
105+
106+
### **C++**
107+
108+
```cpp
109+
class Solution {
110+
public:
111+
int smallestRangeII(vector<int>& nums, int k) {
112+
sort(nums.begin(), nums.end());
113+
int n = nums.size();
114+
int ans = nums[n - 1] - nums[0];
115+
for (int i = 1; i < n; ++i) {
116+
int mi = min(nums[0] + k, nums[i] - k);
117+
int mx = max(nums[i - 1] + k, nums[n - 1] - k);
118+
ans = min(ans, mx - mi);
119+
}
120+
return ans;
121+
}
122+
};
123+
```
75124
125+
### **Go**
126+
127+
```go
128+
func smallestRangeII(nums []int, k int) int {
129+
sort.Ints(nums)
130+
n := len(nums)
131+
ans := nums[n-1] - nums[0]
132+
for i := 1; i < n; i++ {
133+
mi := min(nums[0]+k, nums[i]-k)
134+
mx := max(nums[i-1]+k, nums[n-1]-k)
135+
ans = min(ans, mx-mi)
136+
}
137+
return ans
138+
}
139+
140+
func max(a, b int) int {
141+
if a > b {
142+
return a
143+
}
144+
return b
145+
}
146+
147+
func min(a, b int) int {
148+
if a < b {
149+
return a
150+
}
151+
return b
152+
}
76153
```
77154

78155
### **...**

solution/0900-0999/0910.Smallest Range II/README_EN.md

+70-1
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,82 @@
5353
### **Python3**
5454

5555
```python
56-
56+
class Solution:
57+
def smallestRangeII(self, nums: List[int], k: int) -> int:
58+
nums.sort()
59+
ans = nums[-1] - nums[0]
60+
for i in range(1, len(nums)):
61+
mi = min(nums[0] + k, nums[i] - k)
62+
mx = max(nums[i - 1] + k, nums[-1] - k)
63+
ans = min(ans, mx - mi)
64+
return ans
5765
```
5866

5967
### **Java**
6068

6169
```java
70+
class Solution {
71+
public int smallestRangeII(int[] nums, int k) {
72+
Arrays.sort(nums);
73+
int n = nums.length;
74+
int ans = nums[n - 1] - nums[0];
75+
for (int i = 1; i < n; ++i) {
76+
int mi = Math.min(nums[0] + k, nums[i] - k);
77+
int mx = Math.max(nums[i - 1] + k, nums[n - 1] - k);
78+
ans = Math.min(ans, mx - mi);
79+
}
80+
return ans;
81+
}
82+
}
83+
```
84+
85+
### **C++**
86+
87+
```cpp
88+
class Solution {
89+
public:
90+
int smallestRangeII(vector<int>& nums, int k) {
91+
sort(nums.begin(), nums.end());
92+
int n = nums.size();
93+
int ans = nums[n - 1] - nums[0];
94+
for (int i = 1; i < n; ++i) {
95+
int mi = min(nums[0] + k, nums[i] - k);
96+
int mx = max(nums[i - 1] + k, nums[n - 1] - k);
97+
ans = min(ans, mx - mi);
98+
}
99+
return ans;
100+
}
101+
};
102+
```
62103
104+
### **Go**
105+
106+
```go
107+
func smallestRangeII(nums []int, k int) int {
108+
sort.Ints(nums)
109+
n := len(nums)
110+
ans := nums[n-1] - nums[0]
111+
for i := 1; i < n; i++ {
112+
mi := min(nums[0]+k, nums[i]-k)
113+
mx := max(nums[i-1]+k, nums[n-1]-k)
114+
ans = min(ans, mx-mi)
115+
}
116+
return ans
117+
}
118+
119+
func max(a, b int) int {
120+
if a > b {
121+
return a
122+
}
123+
return b
124+
}
125+
126+
func min(a, b int) int {
127+
if a < b {
128+
return a
129+
}
130+
return b
131+
}
63132
```
64133

65134
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution {
2+
public:
3+
int smallestRangeII(vector<int>& nums, int k) {
4+
sort(nums.begin(), nums.end());
5+
int n = nums.size();
6+
int ans = nums[n - 1] - nums[0];
7+
for (int i = 1; i < n; ++i) {
8+
int mi = min(nums[0] + k, nums[i] - k);
9+
int mx = max(nums[i - 1] + k, nums[n - 1] - k);
10+
ans = min(ans, mx - mi);
11+
}
12+
return ans;
13+
}
14+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
func smallestRangeII(nums []int, k int) int {
2+
sort.Ints(nums)
3+
n := len(nums)
4+
ans := nums[n-1] - nums[0]
5+
for i := 1; i < n; i++ {
6+
mi := min(nums[0]+k, nums[i]-k)
7+
mx := max(nums[i-1]+k, nums[n-1]-k)
8+
ans = min(ans, mx-mi)
9+
}
10+
return ans
11+
}
12+
13+
func max(a, b int) int {
14+
if a > b {
15+
return a
16+
}
17+
return b
18+
}
19+
20+
func min(a, b int) int {
21+
if a < b {
22+
return a
23+
}
24+
return b
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution {
2+
public int smallestRangeII(int[] nums, int k) {
3+
Arrays.sort(nums);
4+
int n = nums.length;
5+
int ans = nums[n - 1] - nums[0];
6+
for (int i = 1; i < n; ++i) {
7+
int mi = Math.min(nums[0] + k, nums[i] - k);
8+
int mx = Math.max(nums[i - 1] + k, nums[n - 1] - k);
9+
ans = Math.min(ans, mx - mi);
10+
}
11+
return ans;
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Solution:
2+
def smallestRangeII(self, nums: List[int], k: int) -> int:
3+
nums.sort()
4+
ans = nums[-1] - nums[0]
5+
for i in range(1, len(nums)):
6+
mi = min(nums[0] + k, nums[i] - k)
7+
mx = max(nums[i - 1] + k, nums[-1] - k)
8+
ans = min(ans, mx - mi)
9+
return ans

0 commit comments

Comments
 (0)