Skip to content

Commit f6c2bf4

Browse files
rain84yanglbme
andauthored
feat: add solutions to lc problem: No.0995 (doocs#3161)
Co-authored-by: Libin YANG <contact@yanglibin.info>
1 parent 85aa18f commit f6c2bf4

File tree

13 files changed

+461
-29
lines changed

13 files changed

+461
-29
lines changed

solution/0900-0999/0995.Minimum Number of K Consecutive Bit Flips/README.md

+169-9
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ class Solution:
9696
ans = s = 0
9797
for i, x in enumerate(nums):
9898
s += d[i]
99-
if x % 2 == s % 2:
99+
if s % 2 == x:
100100
if i + k > n:
101101
return -1
102102
d[i] += 1
@@ -116,7 +116,7 @@ class Solution {
116116
int ans = 0, s = 0;
117117
for (int i = 0; i < n; ++i) {
118118
s += d[i];
119-
if (nums[i] % 2 == s % 2) {
119+
if (s % 2 == nums[i]) {
120120
if (i + k > n) {
121121
return -1;
122122
}
@@ -143,7 +143,7 @@ public:
143143
int ans = 0, s = 0;
144144
for (int i = 0; i < n; ++i) {
145145
s += d[i];
146-
if (s % 2 == nums[i] % 2) {
146+
if (s % 2 == nums[i]) {
147147
if (i + k > n) {
148148
return -1;
149149
}
@@ -161,13 +161,13 @@ public:
161161
#### Go
162162
163163
```go
164-
func minKBitFlips(nums []int, k int) int {
164+
func minKBitFlips(nums []int, k int) (ans int) {
165165
n := len(nums)
166166
d := make([]int, n+1)
167-
ans, s := 0, 0
167+
s := 0
168168
for i, x := range nums {
169169
s += d[i]
170-
if s%2 == x%2 {
170+
if s%2 == x {
171171
if i+k > n {
172172
return -1
173173
}
@@ -177,7 +177,7 @@ func minKBitFlips(nums []int, k int) int {
177177
ans++
178178
}
179179
}
180-
return ans
180+
return
181181
}
182182
```
183183

@@ -190,7 +190,7 @@ function minKBitFlips(nums: number[], k: number): number {
190190
let [ans, s] = [0, 0];
191191
for (let i = 0; i < n; ++i) {
192192
s += d[i];
193-
if (s % 2 === nums[i] % 2) {
193+
if (s % 2 === nums[i]) {
194194
if (i + k > n) {
195195
return -1;
196196
}
@@ -215,7 +215,7 @@ impl Solution {
215215
let mut s = 0;
216216
for i in 0..n {
217217
s += d[i];
218-
if nums[i] % 2 == s % 2 {
218+
if s % 2 == nums[i] {
219219
if i + (k as usize) > n {
220220
return -1;
221221
}
@@ -234,4 +234,164 @@ impl Solution {
234234

235235
<!-- solution:end -->
236236

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+
237397
<!-- problem:end -->

0 commit comments

Comments
 (0)