Leetcode 424:保存窗口大小到变量致代码失败的原因排查
问题原因分析:滑动窗口中变量更新时机错误
你的问题核心出在窗口大小变量的更新时机上——当滑动窗口的左边界(window_start)移动时,你没有同步更新保存窗口大小的window_size变量,导致这个变量的值和实际窗口大小脱节,破坏了滑动窗口的判断逻辑。
具体场景还原
Leetcode 424的核心逻辑是:当窗口大小 - 窗口内最多重复字符数 > k时,需要移动左边界收缩窗口。
- 通过版本:每次判断和更新结果时,都直接在线计算
window_end - window_start + 1,这个值始终和当前窗口的实际大小保持一致,无论左边界怎么移动,计算出来的都是实时正确的窗口大小。 - 失败版本:你只在右边界(
window_end)移动时更新了window_size,但当左边界window_start向右移动(收缩窗口)后,没有重新计算并更新window_size,导致后续判断和结果更新用的都是旧的、偏大的窗口大小值。
举个简单例子:
假设当前window_end=5,window_start=0,window_size=6。此时因为6 - max_count > k,需要移动左边界到1,实际窗口大小应该是5,但如果没更新window_size,后续判断还是用6来计算,会导致窗口收缩不彻底,最终得到错误的最长长度。
错误代码的典型问题片段
你的失败代码大概率类似这样(关键问题点已标注):
while window_end < len(s): count[s[window_end]] += 1 max_count = max(max_count, count[s[window_end]]) window_size = window_end - window_start + 1 # 仅在右边界移动时更新 while window_size - max_count > k: count[s[window_start]] -= 1 window_start += 1 # !!这里缺少window_size的更新,导致window_size和实际窗口大小不一致!! result = max(result, window_size) window_end += 1
修复方法
只需要在每次移动window_start后,同步更新window_size即可:
while window_end < len(s): count[s[window_end]] += 1 max_count = max(max_count, count[s[window_end]]) window_size = window_end - window_start + 1 while window_size - max_count > k: count[s[window_start]] -= 1 window_start += 1 window_size = window_end - window_start + 1 # 新增:左边界移动后更新窗口大小 result = max(result, window_size) window_end += 1
或者更简单的,直接沿用通过版本的写法,每次需要窗口大小时在线计算,从根源上避免变量不同步的问题。
内容的提问来源于stack exchange,提问作者chthonicThreat
相关产品推荐
相关产品推荐

