Skip to content

Commit 6eed8f8

Browse files
committed
feat: add solutions to lc problem: No.2009
No.2009.Minimum Number of Operations to Make Array Continuous
1 parent 7a554d7 commit 6eed8f8

File tree

6 files changed

+355
-74
lines changed

6 files changed

+355
-74
lines changed

Diff for: solution/2000-2099/2009.Minimum Number of Operations to Make Array Continuous/README.md

+161-23
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,26 @@
6060

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

63+
**方法一:排序 + 去重 + 二分查找**
64+
65+
我们先将数组排序,去重。
66+
67+
然后遍历数组,枚举以当前元素 $nums[i]$ 作为连续数组的最小值,通过二分查找找到第一个大于 $nums[i] + n - 1$ 的位置 $j$,那么 $j-i$ 就是当前元素作为最小值时,连续数组的长度,更新答案,即 $ans = \min(ans, n - (j - i))$。
68+
69+
最后返回 $ans$ 即可。
70+
71+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 为数组长度。
72+
73+
**方法二:排序 + 去重 + 双指针**
74+
75+
与方法一类似,我们先将数组排序,去重。
76+
77+
然后遍历数组,枚举以当前元素 $nums[i]$ 作为连续数组的最小值,通过双指针找到第一个大于 $nums[i] + n - 1$ 的位置 $j$,那么 $j-i$ 就是当前元素作为最小值时,连续数组的长度,更新答案,即 $ans = \min(ans, n - (j - i))$。
78+
79+
最后返回 $ans$ 即可。
80+
81+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 为数组长度。
82+
6383
<!-- tabs:start -->
6484

6585
### **Python3**
@@ -69,15 +89,24 @@
6989
```python
7090
class Solution:
7191
def minOperations(self, nums: List[int]) -> int:
72-
n = len(nums)
92+
ans = n = len(nums)
7393
nums = sorted(set(nums))
94+
for i, v in enumerate(nums):
95+
j = bisect_right(nums, v + n - 1)
96+
ans = min(ans, n - (j - i))
97+
return ans
98+
```
7499

75-
ans = n
76-
for i, start in enumerate(nums):
77-
end = start + n - 1
78-
j = bisect_right(nums, end)
79-
remainLen = j - i
80-
ans = min(ans, n - remainLen)
100+
```python
101+
class Solution:
102+
def minOperations(self, nums: List[int]) -> int:
103+
n = len(nums)
104+
nums = sorted(set(nums))
105+
ans, j = n, 0
106+
for i, v in enumerate(nums):
107+
while j < len(nums) and nums[j] - v <= n - 1:
108+
j += 1
109+
ans = min(ans, n - (j - i))
81110
return ans
82111
```
83112

@@ -88,21 +117,54 @@ class Solution:
88117
```java
89118
class Solution {
90119
public int minOperations(int[] nums) {
91-
int N = nums.length;
92-
if (N == 1) return 0;
120+
int n = nums.length;
93121
Arrays.sort(nums);
94-
int M = 1;
95-
for (int i = 1; i < N; i++) {
96-
if (nums[i] != nums[i - 1]) nums[M++] = nums[i];
122+
int m = 1;
123+
for (int i = 1; i < n; ++i) {
124+
if (nums[i] != nums[i - 1]) {
125+
nums[m++] = nums[i];
126+
}
127+
}
128+
int ans = n;
129+
for (int i = 0; i < m; ++i) {
130+
int j = search(nums, nums[i] + n - 1, i, m);
131+
ans = Math.min(ans, n - (j - i));
97132
}
133+
return ans;
134+
}
98135

99-
int j = 0;
100-
int ans = N;
101-
for (int i = 0; i < M; i++) {
102-
while (j < M && nums[j] <= N + nums[i] - 1) j++;
103-
ans = Math.min(ans, N - j + i);
136+
private int search(int[] nums, int x, int left, int right) {
137+
while (left < right) {
138+
int mid = (left + right) >> 1;
139+
if (nums[mid] > x) {
140+
right = mid;
141+
} else {
142+
left = mid + 1;
143+
}
104144
}
145+
return left;
146+
}
147+
}
148+
```
105149

150+
```java
151+
class Solution {
152+
public int minOperations(int[] nums) {
153+
int n = nums.length;
154+
Arrays.sort(nums);
155+
int m = 1;
156+
for (int i = 1; i < n; ++i) {
157+
if (nums[i] != nums[i - 1]) {
158+
nums[m++] = nums[i];
159+
}
160+
}
161+
int ans = n;
162+
for (int i = 0, j = 0; i < m; ++i) {
163+
while (j < m && nums[j] - nums[i] <= n - 1) {
164+
++j;
165+
}
166+
ans = Math.min(ans, n - (j - i));
167+
}
106168
return ans;
107169
}
108170
}
@@ -115,19 +177,95 @@ class Solution {
115177
public:
116178
int minOperations(vector<int>& nums) {
117179
sort(nums.begin(), nums.end());
118-
int End = unique(nums.begin(), nums.end()) - nums.begin();
180+
int m = unique(nums.begin(), nums.end()) - nums.begin();
119181
int n = nums.size();
182+
int ans = n;
183+
for (int i = 0; i < m; ++i) {
184+
int j = upper_bound(nums.begin() + i, nums.begin() + m, nums[i] + n - 1) - nums.begin();
185+
ans = min(ans, n - (j - i));
186+
}
187+
return ans;
188+
}
189+
};
190+
```
120191
121-
int len = 0;
122-
for (int i = 0; i < End; ++i) {
123-
int temp = upper_bound(nums.begin(), nums.begin() + End, n + nums[i] - 1) - nums.begin() - i;
124-
len = max(len, temp);
192+
```cpp
193+
class Solution {
194+
public:
195+
int minOperations(vector<int>& nums) {
196+
sort(nums.begin(), nums.end());
197+
int m = unique(nums.begin(), nums.end()) - nums.begin();
198+
int n = nums.size();
199+
int ans = n;
200+
for (int i = 0, j = 0; i < m; ++i) {
201+
while (j < m && nums[j] - nums[i] <= n - 1) {
202+
++j;
203+
}
204+
ans = min(ans, n - (j - i));
125205
}
126-
return n - len;
206+
return ans;
127207
}
128208
};
129209
```
130210

211+
### **Go**
212+
213+
```go
214+
func minOperations(nums []int) int {
215+
sort.Ints(nums)
216+
n := len(nums)
217+
m := 1
218+
for i := 1; i < n; i++ {
219+
if nums[i] != nums[i-1] {
220+
nums[m] = nums[i]
221+
m++
222+
}
223+
}
224+
ans := n
225+
for i := 0; i < m; i++ {
226+
j := sort.Search(m, func(k int) bool { return nums[k] > nums[i]+n-1 })
227+
ans = min(ans, n-(j-i))
228+
}
229+
return ans
230+
}
231+
232+
func min(a, b int) int {
233+
if a < b {
234+
return a
235+
}
236+
return b
237+
}
238+
```
239+
240+
```go
241+
func minOperations(nums []int) int {
242+
sort.Ints(nums)
243+
n := len(nums)
244+
m := 1
245+
for i := 1; i < n; i++ {
246+
if nums[i] != nums[i-1] {
247+
nums[m] = nums[i]
248+
m++
249+
}
250+
}
251+
ans := n
252+
for i, j := 0, 0; i < m; i++ {
253+
for j < m && nums[j]-nums[i] <= n-1 {
254+
j++
255+
}
256+
ans = min(ans, n-(j-i))
257+
}
258+
return ans
259+
}
260+
261+
func min(a, b int) int {
262+
if a < b {
263+
return a
264+
}
265+
return b
266+
}
267+
```
268+
131269
### **...**
132270

133271
```

0 commit comments

Comments
 (0)