60
60
61
61
<!-- 这里可写通用的实现逻辑 -->
62
62
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
+
63
83
<!-- tabs:start -->
64
84
65
85
### ** Python3**
69
89
``` python
70
90
class Solution :
71
91
def minOperations (self , nums : List[int ]) -> int :
72
- n = len (nums)
92
+ ans = n = len (nums)
73
93
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
+ ```
74
99
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))
81
110
return ans
82
111
```
83
112
@@ -88,21 +117,54 @@ class Solution:
88
117
``` java
89
118
class Solution {
90
119
public int minOperations (int [] nums ) {
91
- int N = nums. length;
92
- if (N == 1 ) return 0 ;
120
+ int n = nums. length;
93
121
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));
97
132
}
133
+ return ans;
134
+ }
98
135
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
+ }
104
144
}
145
+ return left;
146
+ }
147
+ }
148
+ ```
105
149
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
+ }
106
168
return ans;
107
169
}
108
170
}
@@ -115,19 +177,95 @@ class Solution {
115
177
public:
116
178
int minOperations(vector<int >& nums) {
117
179
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();
119
181
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
+ ```
120
191
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));
125
205
}
126
- return n - len ;
206
+ return ans ;
127
207
}
128
208
};
129
209
```
130
210
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
+
131
269
### ** ...**
132
270
133
271
```
0 commit comments