995. K 连续位的最小翻转次数
在仅包含 0 和 1 的数组 A 中,一次 K 位翻转包括选择一个长度为 K 的(连续)子数组,同时将子数组中的每个 0 更改为 1,而每个 1 更改为 0。
返回所需的 K 位翻转的最小次数,以便数组没有值为 0 的元素。如果不可能,返回 -1。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-number-of-k-consecutive-bit-flips
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
滑动窗口 + 队列
import java.util.LinkedList;
import java.util.Queue;
class Solution {
public int minKBitFlips(int[] A, int K) {
int res = 0;
Queue<Integer> que = new LinkedList<>();
for (int i = 0; i < A.length; i++) {
if (que.size() > 0 && i > que.peek() + K - 1) {
que.poll();
}
//1.本来是1,翻转奇数次变为0,所以需要再次翻转,放入队列
//2.本来是0,翻转偶数次还是0,所以需要再次翻转,放入队列
if (que.size() % 2 == A[i]) {
if (i + K > A.length) {
return -1;
}
que.offer(i);
res += 1;
}
}
return res;
}
}
滑动窗口 + 标记数组
class Solution {
public int minKBitFlips(int[] A, int K) {
int len = A.length, res = 0, reverseCount = 0;
for (int i = 0; i < len; i++) {
if (i - K >= 0 && A[i - K] > 1) {
reverseCount--;
}
if (reverseCount % 2 == A[i]) {
if (i + K > len) {
return -1;
}
A[i] += 2;
reverseCount++;
res++;
}
}
return res;
}
}
心之所向,素履以往 生如逆旅,一苇以航