@@ -96,7 +96,7 @@ class Solution:
96
96
ans = s = 0
97
97
for i, x in enumerate (nums):
98
98
s += d[i]
99
- if x % 2 == s % 2 :
99
+ if s % 2 == x :
100
100
if i + k > n:
101
101
return - 1
102
102
d[i] += 1
@@ -116,7 +116,7 @@ class Solution {
116
116
int ans = 0 , s = 0 ;
117
117
for (int i = 0 ; i < n; ++ i) {
118
118
s += d[i];
119
- if (nums[i] % 2 == s % 2 ) {
119
+ if (s % 2 == nums[i] ) {
120
120
if (i + k > n) {
121
121
return - 1 ;
122
122
}
@@ -143,7 +143,7 @@ public:
143
143
int ans = 0, s = 0;
144
144
for (int i = 0; i < n; ++i) {
145
145
s += d[ i] ;
146
- if (s % 2 == nums[ i] % 2 ) {
146
+ if (s % 2 == nums[ i] ) {
147
147
if (i + k > n) {
148
148
return -1;
149
149
}
@@ -161,13 +161,13 @@ public:
161
161
#### Go
162
162
163
163
```go
164
- func minKBitFlips(nums []int, k int) int {
164
+ func minKBitFlips(nums []int, k int) (ans int) {
165
165
n := len(nums)
166
166
d := make([]int, n+1)
167
- ans, s := 0, 0
167
+ s := 0
168
168
for i, x := range nums {
169
169
s += d[i]
170
- if s%2 == x%2 {
170
+ if s%2 == x {
171
171
if i+k > n {
172
172
return -1
173
173
}
@@ -177,7 +177,7 @@ func minKBitFlips(nums []int, k int) int {
177
177
ans++
178
178
}
179
179
}
180
- return ans
180
+ return
181
181
}
182
182
```
183
183
@@ -190,7 +190,7 @@ function minKBitFlips(nums: number[], k: number): number {
190
190
let [ans, s] = [0 , 0 ];
191
191
for (let i = 0 ; i < n ; ++ i ) {
192
192
s += d [i ];
193
- if (s % 2 === nums [i ] % 2 ) {
193
+ if (s % 2 === nums [i ]) {
194
194
if (i + k > n ) {
195
195
return - 1 ;
196
196
}
@@ -215,7 +215,7 @@ impl Solution {
215
215
let mut s = 0 ;
216
216
for i in 0 .. n {
217
217
s += d [i ];
218
- if nums [ i ] % 2 == s % 2 {
218
+ if s % 2 == nums [ i ] {
219
219
if i + (k as usize ) > n {
220
220
return - 1 ;
221
221
}
@@ -234,4 +234,164 @@ impl Solution {
234
234
235
235
<!-- solution: end -->
236
236
237
+ <!-- solution: start -->
238
+
239
+ ### 方法二:滑动窗口
240
+
241
+ 我们可以用一个变量 $\text{flipped}$ 来表示当前位置是否翻转,如果 $\text{flipped}$ 为 $1$,表示当前位置已经翻转,否则表示当前位置未翻转。对于翻转过的位置,我们可以将其值设置为 $-1$,这样我们就可以区分出哪些位置已经翻转过了。
242
+
243
+ 接下来我们从左到右遍历数组,对于每个位置 $i$,如果 $i \geq k$ 且 $i-k$ 位置的元素为 $-1$,那么当前位置的翻转状态应该与前一个位置的翻转状态相反。即 $\text{flipped} = \text{flipped} \oplus 1$。如果当前位置的元素与当前位置的翻转状态相同,那么我们需要翻转当前位置,此时我们判断一下 $i+k$ 是否超出了数组的长度,如果超出了数组的长度,那么就无法完成目标,返回 $-1$。否则我们将当前位置的翻转状态取反,同时将答案增加 $1$,并且将当前位置的元素设置为 $-1$。
244
+
245
+ 这样当我们处理完数组中的所有元素时,返回答案即可。
246
+
247
+ 时间复杂度 $O(n)$,其中 $n$ 是数组 $nums$ 的长度。空间复杂度 $O(1)$。
248
+
249
+ <!-- tabs: start -->
250
+
251
+ #### Python3
252
+
253
+ ``` python
254
+ class Solution :
255
+ def minKBitFlips (self , nums : List[int ], k : int ) -> int :
256
+ ans = flipped = 0
257
+ for i, x in enumerate (nums):
258
+ if i >= k and nums[i - k] == - 1 :
259
+ flipped ^= 1
260
+ if x == flipped:
261
+ if i + k > len (nums):
262
+ return - 1
263
+ flipped ^= 1
264
+ ans += 1
265
+ nums[i] = - 1
266
+ return ans
267
+ ```
268
+
269
+ #### Java
270
+
271
+ ``` java
272
+ class Solution {
273
+ public int minKBitFlips (int [] nums , int k ) {
274
+ int n = nums. length;
275
+ int ans = 0 , flipped = 0 ;
276
+ for (int i = 0 ; i < n; ++ i) {
277
+ if (i >= k && nums[i - k] == - 1 ) {
278
+ flipped ^ = 1 ;
279
+ }
280
+ if (flipped == nums[i]) {
281
+ if (i + k > n) {
282
+ return - 1 ;
283
+ }
284
+ flipped ^ = 1 ;
285
+ ++ ans;
286
+ nums[i] = - 1 ;
287
+ }
288
+ }
289
+ return ans;
290
+ }
291
+ }
292
+ ```
293
+
294
+ #### C++
295
+
296
+ ``` cpp
297
+ class Solution {
298
+ public:
299
+ int minKBitFlips(vector<int >& nums, int k) {
300
+ int n = nums.size();
301
+ int ans = 0, flipped = 0;
302
+ for (int i = 0; i < n; ++i) {
303
+ if (i >= k && nums[ i - k] == -1) {
304
+ flipped ^= 1;
305
+ }
306
+ if (flipped == nums[ i] ) {
307
+ if (i + k > n) {
308
+ return -1;
309
+ }
310
+ flipped ^= 1;
311
+ ++ans;
312
+ nums[ i] = -1;
313
+ }
314
+ }
315
+ return ans;
316
+ }
317
+ };
318
+ ```
319
+
320
+ #### Go
321
+
322
+ ```go
323
+ func minKBitFlips(nums []int, k int) (ans int) {
324
+ flipped := 0
325
+ for i, x := range nums {
326
+ if i >= k && nums[i-k] == -1 {
327
+ flipped ^= 1
328
+ }
329
+ if flipped == x {
330
+ if i+k > len(nums) {
331
+ return -1
332
+ }
333
+ flipped ^= 1
334
+ ans++
335
+ nums[i] = -1
336
+ }
337
+ }
338
+ return
339
+ }
340
+ ```
341
+
342
+ #### TypeScript
343
+
344
+ ``` ts
345
+ function minKBitFlips(nums : number [], k : number ): number {
346
+ const n = nums .length ;
347
+ let [ans, flipped] = [0 , 0 ];
348
+ for (let i = 0 ; i < n ; i ++ ) {
349
+ if (nums [i - k ] === - 1 ) {
350
+ flipped ^= 1 ;
351
+ }
352
+ if (nums [i ] === flipped ) {
353
+ if (i + k > n ) {
354
+ return - 1 ;
355
+ }
356
+ flipped ^= 1 ;
357
+ ++ ans ;
358
+ nums [i ] = - 1 ;
359
+ }
360
+ }
361
+ return ans ;
362
+ }
363
+ ```
364
+
365
+ #### Rust
366
+
367
+ ``` rust
368
+ impl Solution {
369
+ pub fn min_k_bit_flips (mut nums : Vec <i32 >, k : i32 ) -> i32 {
370
+ let mut ans = 0 ;
371
+ let mut flipped = 0 ;
372
+ let k = k as usize ;
373
+
374
+ for i in 0 .. nums . len () {
375
+ if i >= k && nums [i - k ] == - 1 {
376
+ flipped ^= 1 ;
377
+ }
378
+ if flipped == nums [i ] {
379
+ if i + k > nums . len () {
380
+ return - 1 ;
381
+ }
382
+ flipped ^= 1 ;
383
+ ans += 1 ;
384
+ nums [i ] = - 1 ;
385
+ }
386
+ }
387
+
388
+ ans
389
+ }
390
+ }
391
+ ```
392
+
393
+ <!-- tabs: end -->
394
+
395
+ <!-- solution: end -->
396
+
237
397
<!-- problem: end -->
0 commit comments