美文网首页
2021.2.18每日一题

2021.2.18每日一题

作者: Yaan9 | 来源:发表于2021-02-18 09:51 被阅读0次

995. K 连续位的最小翻转次数

在仅包含 0 和 1 的数组 A 中,一次 K 位翻转包括选择一个长度为 K 的(连续)子数组,同时将子数组中的每个 0 更改为 1,而每个 1 更改为 0。
返回所需的 K 位翻转的最小次数,以便数组没有值为 0 的元素。如果不可能,返回 -1。
示例 1:

输入:A = [0,1,0], K = 1
输出:2
解释:先翻转 A[0],然后翻转 A[2]。

示例 2:

输入:A = [1,1,0], K = 2
输出:-1
解释:无论我们怎样翻转大小为 2 的子数组,我们都不能使数组变为 [1,1,1]。

示例 3:

输入:A = [0,0,0,1,0,1,1,0], K = 3
输出:3
解释:
翻转 A[0],A[1],A[2]: A变成 [1,1,1,1,0,1,1,0]
翻转 A[4],A[5],A[6]: A变成 [1,1,1,1,1,0,0,0]
翻转 A[5],A[6],A[7]: A变成 [1,1,1,1,1,1,1,1]

题解:

贪心算法:从头遍历数组,遇到0时,反转其在内的K个连续元素。若某个0元素后面不足K个,返回-1。其中需要注意的是在进行翻转操作时,若使用的是三元运算符,可能会超时;最好使用异或(^)位运算。

    public int minKBitFlips(int[] A, int K) {
        if (A == null || A.length == 0) return 0;
        int n = A.length;
        int count = 0;
        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;
                }
                count++;
            }
        }
        return count;
    }

滑动窗口:
参考了这位大佬的解释。其中比较难理解的是curFilp,它表示这个大小为K的窗口一共翻转了几次;还有在翻转时,选择让元素+2,窗口左边界右移时让原窗口的左边界-2,保证了元素的奇偶性。

    public int minKBitFlips(int[] A, int K) {
        if (A == null || A.length == 0) return 0;
        int n = A.length;
        int curFlip = 0;
        int res = 0;
        for (int i = 0; i < n; i++) {
            // 处理左边界
            if (i >= K && A[i - K] > 1) {
                curFlip--;
                A[i - K] -= 2; 
            }
            // 处理右边界
            if (curFlip % 2 == 0 && A[i] == 0 || curFlip % 2 == 1 && A[i] == 1) { 
                if (i + K > n) return -1;
                A[i] += 2;  
                curFlip++;
                res++;
            }
        }
        return res;
    }

相关文章

  • 2021.2.18每日一题

    995. K 连续位的最小翻转次数[https://leetcode-cn.com/problems/minimu...

  • Day 4 Project 我的微信好友

    附:每日一题

  • 22 祝你快乐

    每日一句: 我将玫瑰藏在身后,期待与你赴约。 正文: 2021.2.18我的第22个生日。 去年因为疫情,...

  • 每日复盘分享

    90/Day29/有效学习,从每日复盘分享开始 2021.2.18关键词:末位淘汰制、法律风险 【劳动关系篇】如何...

  • 【2021.2.18】

    8力量:以柔克刚 看到牌面的感受:温暖、自信、充满希望、有力量 对应事件: 1.自我学习和成长:经过这段时间的休养...

  • 2021.2.18

    时间过得真快,初七了。 认真学习的心已经放飞了,乱七八糟的事,想着乱七八糟的东西,完全打乱节奏,不知道自己在干什么...

  • 2021.2.18

    未婚的快乐在开工大吉!

  • 2021.2.18

    2011年的初春,整个人突然变得冷漠、疏离,鲜少同人沟通交流,微笑的动作成了奢侈品,好像全世界,只剩下自己。 沉默...

  • 2021.2.18

    今天收获很多。曾经教过的学生寄来了新年礼物,与礼物相比,那份心意更让我感动。作为一名教师的职业成就感也油然而生,能...

  • 2021.2.18

    疲惫劳累的一天睡眠质量就是高 连带着午觉都睡得很香 每个人都在努力 也许在看不到的地方 中午和家人视频 傍晚也视频...

网友评论

      本文标题:2021.2.18每日一题

      本文链接:https://www.haomeiwen.com/subject/ihsgxltx.html