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;
    }
}
posted @ 2022-01-25 15:33  Tianyiya  阅读(27)  评论(0)    收藏  举报