写点什么

【LeetCode】K 连续位的最小翻转次数 Java 题解

用户头像
HQ数字卡
关注
发布于: 2021 年 02 月 18 日

题目

在仅包含 0 和 1 的数组 A 中,一次 K 位翻转包括选择一个长度为 K 的(连续)子数组,同时将子数组中的每个 0 更改为 1,而每个 1 更改为 0。


返回所需的 K 位翻转的最小次数,以便数组没有值为 0 的元素。如果不可能,返回 -1。


代码

public class DayCode {    public static void main(String[] args) {        int[] A = new int[]{0, 1, 0};        int K = 1;        int ans = new DayCode().minKBitFlips(A, K);        System.out.println("ans is " + ans);    }
/** * https://leetcode-cn.com/problems/minimum-number-of-k-consecutive-bit-flips/ * 时间复杂度O(n * k),空间复杂度O(1) * @param A * @param K * @return */ public int minKBitFlips(int[] A, int K) { int ans = 0; int n = A.length; for (int i = 0; i < n; i++) { if (A[i] == 0) { if (i + K > n) { return -1; } for (int j = i; j < i + K; j++) { A[j] ^= 1; } ans++; } } return ans; }
/** * https://leetcode-cn.com/problems/minimum-number-of-k-consecutive-bit-flips/ * 时间复杂度O(n),空间复杂度O(n) * @param A * @param K * @return */ public int minKBitFlipsTwo(int[] A, int K) { int ans = 0; Deque<Integer> queue = new LinkedList<>(); for (int i = 0; i < A.length; i++) { if (queue.size() > 0 && i > queue.peek() + K - 1) { queue.removeFirst(); } if (queue.size() % 2 == A[i]) { if (i + K > A.length) { return -1; } queue.add(i); ans++; } } return ans; }}
复制代码

总结

  • 这个题目含义容易理解,就是翻转 K 个连续位, 如果翻转后的结果,可以全部为 1,即返回翻转次数,如果不能,则返回-1

  • 方法一是题目含义的具体实现,位运算很巧妙。

  • 方法二则是不真的翻转数组,需要深入的思考,应用了滑动窗口的思想。A[i] 翻转偶数次的结果是 A[i];翻转奇数次的结果是 A[i] ^ 1。

  • 每日坚持一题,加油!


发布于: 2021 年 02 月 18 日阅读数: 10
用户头像

HQ数字卡

关注

还未添加个人签名 2019.09.29 加入

LeetCode,略懂后端的RD

评论

发布
暂无评论
【LeetCode】K 连续位的最小翻转次数Java题解