LeetCode 题解工作台
K 连续位的最小翻转次数
给定一个二进制数组 nums 和一个整数 k 。 k位翻转 就是从 nums 中选择一个长度为 k 的 子数组 ,同时把子数组中的每一个 0 都改成 1 ,把子数组中的每一个 1 都改成 0 。 返回数组中不存在 0 所需的最小 k位翻转 次数。如果不可能,则返回 -1 。 子数组 是数组的 连续 …
5
题型
6
代码语言
3
相关题
当前训练重点
困难 · 滑动窗口(状态滚动更新)
答案摘要
我们注意到,对于若干个连续的元素进行反转,其结果与对这些元素进行反转的次序无关。因此我们可以贪心地考虑每个位置需要进行反转的次数。 我们不妨从左到右处理数组。
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 滑动窗口(状态滚动更新) 题型思路
题目描述
给定一个二进制数组 nums 和一个整数 k 。
k位翻转 就是从 nums 中选择一个长度为 k 的 子数组 ,同时把子数组中的每一个 0 都改成 1 ,把子数组中的每一个 1 都改成 0 。
返回数组中不存在 0 所需的最小 k位翻转 次数。如果不可能,则返回 -1 。
子数组 是数组的 连续 部分。
示例 1:
输入:nums = [0,1,0], K = 1 输出:2 解释:先翻转 A[0],然后翻转 A[2]。
示例 2:
输入:nums = [1,1,0], K = 2 输出:-1 解释:无论我们怎样翻转大小为 2 的子数组,我们都不能使数组变为 [1,1,1]。
示例 3:
输入:nums = [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]
提示:
1 <= nums.length <= 1051 <= k <= nums.length
解题思路
方法一:差分数组
我们注意到,对于若干个连续的元素进行反转,其结果与对这些元素进行反转的次序无关。因此我们可以贪心地考虑每个位置需要进行反转的次数。
我们不妨从左到右处理数组。
假设当前我们需要处理位置 ,而位置 左侧的元素已经被处理完毕,如果 位置的元素为 ,那么我们必须进行反转操作,我们需要将 区间内的元素进行反转。这里我们用一个差分数组 来维护每个位置的反转次数,那么判断当前位置 是否需要反转,只需要看 以及 的奇偶性,如果 与 奇偶性相同,那么位置 的元素仍然为 ,需要进行反转。此时我们判断一下 是否超出了数组的长度,如果超出了数组的长度,那么就无法完成目标,返回 。否则我们令 增加 ,同时令 减少 ,然后将答案增加 ,并且 增加 。
这样当我们处理完数组中的所有元素时,返回答案即可。
时间复杂度 ,空间复杂度 。这里 是数组 的长度。
class Solution:
def minKBitFlips(self, nums: List[int], k: int) -> int:
n = len(nums)
d = [0] * (n + 1)
ans = s = 0
for i, x in enumerate(nums):
s += d[i]
if s % 2 == x:
if i + k > n:
return -1
d[i] += 1
d[i + k] -= 1
s += 1
ans += 1
return ans
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | O(n) |
| 空间 | O(1) |
面试官常问的追问
外企场景- question_mark
Check if the candidate correctly maintains flip parity without physically flipping the array.
- question_mark
Watch for proper handling of edge indices where a k-length flip may exceed array bounds.
- question_mark
Observe if the candidate optimizes from a brute-force O(n*k) approach to the efficient O(n) sliding window solution.
常见陷阱
外企场景- error
Forgetting to consider flips already applied when deciding to flip the current element.
- error
Attempting to flip subarrays without tracking previous flips, leading to incorrect results or O(n*k) complexity.
- error
Not returning -1 when a flip is required but insufficient elements remain for a k-length subarray.
进阶变体
外企场景- arrow_right_alt
Allow flips of variable length subarrays, requiring dynamic tracking of active flips.
- arrow_right_alt
Count minimum flips to make all elements 0 instead of 1, which mirrors the pattern but inverts the condition.
- arrow_right_alt
Apply the same k-length flip pattern on circular arrays, introducing wrap-around tracking for flips.