SWE · Coding

Meta 最多翻K个0:最长连续1的合法窗口

维护零数量不超K的最长窗口,解释每端指针只前进与非负预算。

题目重点:维护零数量不超K的最长窗口,解释每端指针只前进与非负预算。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练binary array,只允许把最多K个0改1,求最长连续长度;空数组0、K非负,不改输入。
  • 每次翻转一个字符,不按整段零计一次;函数只返回长度,不生成翻转后的数组。

解题路线

  1. right扩一项,zeros增加是否为0;只要zeros>K,left前移并减去离开0的贡献,直到窗口合法。每轮best=max(best,length)。
  2. 对当前right,left停在使窗口合法的最早位置,任何更早start都零太多;因此这是以right结尾最长合法段,所有right取max得全局最优。
  3. K0等同最长原有连续1;K≥0数可包含全部。窗口允许空,算法返回0是没有元素或所有0且K0的合法结果。
  4. “最多K”不是必须翻K,窗口内1无需翻、翻不到K也可。输入不是binary时拒绝,不把所有非0自动视1。

手动走一遍

[1,0,1,0,1]、K1最长3(前三或后三);K2最长5。全0长度4、K2最长2,K0为0。

Python 参考实现

下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。

代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。

def longest_ones(values,k):
    """Binary input, at most k individual zero->one flips; returns length."""
    if k<0:raise ValueError('negative budget')
    left=zeros=best=0
    for right,value in enumerate(values):
        if value not in (0,1):raise ValueError('binary values required')
        zeros+=value==0
        while zeros>k:
            zeros-=values[left]==0;left+=1
        best=max(best,right-left+1)
    return best

复杂度

O(N)时间/O(1)辅助空间,left/right各最多N次前移;内部while不使总时间O(N²)。返回窗口本身只需额外保存最佳两端。

易错点与追问

容易失分的边界

  • 只一次if缩窗却同时当窗口已合法,会在某些写法下错误记录长度。
  • 把至少/恰好K与最多K混同。

继续深挖

  • 一次可翻一段连续0而非单个字符时,预算应计零段,不计零数量。
  • 在线流能否只保存最近K+1个0索引而不保留全数组?
✓已复制微信号!