@@ -165,15 +165,35 @@ func minSwaps(nums []int) int {
165
165
166
166
``` ts
167
167
function minSwaps(nums : number []): number {
168
+ const n = nums .length ;
168
169
const k = nums .reduce ((a , b ) => a + b , 0 );
169
- let cnt = nums .slice (0 , k ).reduce ((a , b ) => a + b , 0 );
170
- let mx = cnt ;
170
+ let cnt = k - nums .slice (0 , k ).reduce ((a , b ) => a + b , 0 );
171
+ let min = cnt ;
172
+
173
+ for (let i = k ; i < n + k ; i ++ ) {
174
+ cnt += nums [i - k ] - nums [i % n ];
175
+ min = Math .min (min , cnt );
176
+ }
177
+
178
+ return min ;
179
+ }
180
+ ```
181
+
182
+ #### JavaScript
183
+
184
+ ``` ts
185
+ function minSwaps(nums ) {
171
186
const n = nums .length ;
172
- for (let i = k ; i < n + k ; ++ i ) {
173
- cnt += nums [i % n ] - nums [(i - k + n ) % n ];
174
- mx = Math .max (mx , cnt );
187
+ const k = nums .reduce ((a , b ) => a + b , 0 );
188
+ let cnt = k - nums .slice (0 , k ).reduce ((a , b ) => a + b , 0 );
189
+ let min = cnt ;
190
+
191
+ for (let i = k ; i < n + k ; i ++ ) {
192
+ cnt += nums [i - k ] - nums [i % n ];
193
+ min = Math .min (min , cnt );
175
194
}
176
- return k - mx ;
195
+
196
+ return min ;
177
197
}
178
198
```
179
199
@@ -224,4 +244,66 @@ public class Solution {
224
244
225
245
<!-- solution: end -->
226
246
247
+ <!-- solution: start -->
248
+
249
+ ### Solution 2: Prefix Sum
250
+
251
+ <!-- tabs: start -->
252
+
253
+ #### TypeScript
254
+
255
+ ``` ts
256
+ function minSwaps(nums : number []): number {
257
+ const n = nums .length ;
258
+
259
+ const getMin = (x : 0 | 1 ) => {
260
+ const prefixSum = Array (n + 1 ).fill (0 );
261
+ for (let i = 1 ; i <= n ; i ++ ) {
262
+ prefixSum [i ] = prefixSum [i - 1 ] + (nums [i - 1 ] === x );
263
+ }
264
+
265
+ const length = prefixSum [n ];
266
+ let ans = Number .POSITIVE_INFINITY;
267
+ for (let l = 0 , r = length ; r <= n ; l ++ , r ++ ) {
268
+ const min = length - (prefixSum [r ] - prefixSum [l ]);
269
+ ans = Math .min (ans , min );
270
+ }
271
+
272
+ return ans ;
273
+ };
274
+
275
+ return Math .min (getMin (0 ), getMin (1 ));
276
+ }
277
+ ```
278
+
279
+ #### JavaScript
280
+
281
+ ``` js
282
+ function minSwaps (nums ) {
283
+ const n = nums .length ;
284
+
285
+ const getMin = x => {
286
+ const prefixSum = Array (n + 1 ).fill (0 );
287
+ for (let i = 1 ; i <= n; i++ ) {
288
+ prefixSum[i] = prefixSum[i - 1 ] + (nums[i - 1 ] === x);
289
+ }
290
+
291
+ const length = prefixSum[n];
292
+ let ans = Number .POSITIVE_INFINITY ;
293
+ for (let l = 0 , r = length; r <= n; l++ , r++ ) {
294
+ const min = length - (prefixSum[r] - prefixSum[l]);
295
+ ans = Math .min (ans, min);
296
+ }
297
+
298
+ return ans;
299
+ };
300
+
301
+ return Math .min (getMin (0 ), getMin (1 ));
302
+ }
303
+ ```
304
+
305
+ <!-- tabs: end -->
306
+
307
+ <!-- solution: end -->
308
+
227
309
<!-- problem: end -->
0 commit comments