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

Posted Alex_996

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Algorithm 995. K 连续位的最小翻转次数相关的知识,希望对你有一定的参考价值。

题目链接:995. K 连续位的最小翻转次数

Ideas

算法:差分
数据结构:数组
思路:区间修改问题可以想到用差分数组(差分数组介绍)。对于每一位的翻转情况:

  • 如果原来为0,前面已经被翻转了偶数次,则还为0,需要翻转;
  • 如果原来为0,前面已经被翻转了奇数次,则变为1,不需翻转;
  • 如果原来为1,前面已经被翻转了偶数次,则变为1,不需翻转;
  • 如果原来为1,前面已经被翻转了奇数次,则变为0,需要翻转。

若用total表示前面已经被翻转的次数,则可以通过(total & 1) ^ nums[i] == 0来判断当前位置是否需要翻转。
解释:奇数 & 1 = 1,偶数 & 1 = 0,(奇数 & 1)^ 1 = 0,(偶数 & 1)^ 0 = 0
还需要注意的是如果当前位置需要被翻转,但是i + k > n,说明不符合条件,返回-1

Code

Python

class Solution:
    def minKBitFlips(self, nums: List[int], k: int) -> int:
        n, ans, total = len(nums), 0, 0
        diff = [0] * (n + 1)
        for i in range(n):
            total += diff[i]
            if (total & 1) ^ nums[i] == 0:
                if i + k > n:
                    return -1
                diff[i] += 1
                if i + k < n:
                    diff[i + k] -= 1
                total += 1
                ans += 1
        return ans

以上是关于LeetCode Algorithm 995. K 连续位的最小翻转次数的主要内容,如果未能解决你的问题,请参考以下文章

leetcode995. Minimum Number of K Consecutive Bit Flips

Leetcode-995 Minimum Number of K Consecutive Bit Flips(K 连续位的最小翻转次数)

LeetCode Algorithm 剑指 Offer 22. 链表中倒数第k个节点

LeetCode Algorithm 1337. 矩阵中战斗力最弱的 K 行

LeetCode Algorithm 1566. 重复至少 K 次且长度为 M 的模式

LeetCode Algorithm 剑指 Offer 22. 链表中倒数第k个节点