题目描述
思路解析动画文字版
记住「0 当 −1 求前缀和;同一个 diff 再现 → 之间 0/1 等量」,下面每帧都在套它。
开局把「空前缀」记下:diff=0 出现在下标 −1。这样若某天 diff 回到 0,就知道从开头到那里整段平衡。0 当 −1、1 当 +1 来累加。
读第 0 位 1,把它当 +1 累进前缀差:diff 从 0 变成 1。下一步看这个 diff 以前见过没。
diff=1 是第一次出现,把它的最早下标记进哈希表 first[1]=0(黄色新行)。只记最早的,这样以后算的段才最长。
读第 1 位 1,把它当 +1 累进前缀差:diff 从 1 变成 2。下一步看这个 diff 以前见过没。
diff=2 是第一次出现,把它的最早下标记进哈希表 first[2]=1(黄色新行)。只记最早的,这样以后算的段才最长。
读第 2 位 0,把它当 −1 累进前缀差:diff 从 2 变成 1。下一步看这个 diff 以前见过没。
diff=1 以前出现过(最早在下标 0)!说明下标 1…2 这段(绿色)0 和 1 一样多,长 2。比旧的最长更长,刷新 best=2。
读第 3 位 1,把它当 +1 累进前缀差:diff 从 1 变成 2。下一步看这个 diff 以前见过没。
diff=2 以前出现过(最早在下标 1)!说明下标 2…3 这段(绿色)0 和 1 一样多,长 2。没超过当前最长 2,保持。
读第 4 位 0,把它当 −1 累进前缀差:diff 从 2 变成 1。下一步看这个 diff 以前见过没。
diff=1 以前出现过(最早在下标 0)!说明下标 1…4 这段(绿色)0 和 1 一样多,长 4。比旧的最长更长,刷新 best=4。
读第 5 位 0,把它当 −1 累进前缀差:diff 从 1 变成 0。下一步看这个 diff 以前见过没。
diff=0 以前出现过(最早在下标 -1)!说明下标 0…5 这段(绿色)0 和 1 一样多,长 6。比旧的最长更长,刷新 best=6。
读第 6 位 1,把它当 +1 累进前缀差:diff 从 0 变成 1。下一步看这个 diff 以前见过没。
diff=1 以前出现过(最早在下标 0)!说明下标 1…6 这段(绿色)0 和 1 一样多,长 6。没超过当前最长 6,保持。
读第 7 位 0,把它当 −1 累进前缀差:diff 从 1 变成 0。下一步看这个 diff 以前见过没。
diff=0 以前出现过(最早在下标 -1)!说明下标 0…7 这段(绿色)0 和 1 一样多,长 8。比旧的最长更长,刷新 best=8。
读第 8 位 1,把它当 +1 累进前缀差:diff 从 0 变成 1。下一步看这个 diff 以前见过没。
diff=1 以前出现过(最早在下标 0)!说明下标 1…8 这段(绿色)0 和 1 一样多,长 8。没超过当前最长 8,保持。
读第 9 位 1,把它当 +1 累进前缀差:diff 从 1 变成 2。下一步看这个 diff 以前见过没。
diff=2 以前出现过(最早在下标 1)!说明下标 2…9 这段(绿色)0 和 1 一样多,长 8。没超过当前最长 8,保持。
扫完全程,最长的平衡段是绿色这 8 个(下标 0…7,0 和 1 各 4 个),答案 8。靠「同一个 diff 再现」一遍扫描就找到了。
边界先想清:空、全同(无重复 diff)、整段平衡。
认出「前缀和相等 + 哈希」这个母题,能迁移一大批子数组题。
参考代码
from typing import Listclass Solution: def findMaxLength(self, nums: List[int]) -> int: first = {0: -1} diff = 0 best = 0 for i, x in enumerate(nums): diff += 1 if x == 1 else -1 if diff in first: best = max(best, i - first[diff]) else: first[diff] = i return best复杂度
- 时间:O(n),一遍扫描,哈希查/插 O(1)
- 空间:O(n),哈希表最多存 n 个不同的 diff
易错点
面试追问把动画讲成自己的话
追问这套「前缀和 + 哈希存最早下标」还能解哪些题?
追问如果问的是“数量”而不是“最长长度”呢?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
和为 K 的子数组
LeetCode 560 · 中等 · 沿着 前缀和套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题