题目描述
思路解析动画文字版
记住「子数组和=goal ⟺ 找更早的前缀和=当前前缀和−goal」,下面每帧都在套它。
开局:前缀和为 0、答案为 0。表里先放一个「前缀和 0 出现 1 次」——它代表从头开始的子数组(空前缀),别漏。
读到第 0 个(1),前缀和变成 1。要找前缀和 = 1−2 = -1:表里没有,这一步贡献 0。
结算:答案加 0,变成 0。再把当前前缀和 1 记进表(高亮行,现 1 次),供后面的元素来匹配。
读到第 1 个(0),前缀和变成 1。要找前缀和 = 1−2 = -1:表里没有,这一步贡献 0。
结算:答案加 0,变成 0。再把当前前缀和 1 记进表(高亮行,现 2 次),供后面的元素来匹配。
读到第 2 个(1),前缀和变成 2。要找前缀和 = 2−2 = 0:表里有 1 个(高亮行),说明有 1 个以这里结尾、和为 2 的子数组。
结算:答案加 1,变成 1。再把当前前缀和 2 记进表(高亮行,现 1 次),供后面的元素来匹配。
读到第 3 个(0),前缀和变成 2。要找前缀和 = 2−2 = 0:表里有 1 个(高亮行),说明有 1 个以这里结尾、和为 2 的子数组。
结算:答案加 1,变成 2。再把当前前缀和 2 记进表(高亮行,现 2 次),供后面的元素来匹配。
读到第 4 个(1),前缀和变成 3。要找前缀和 = 3−2 = 1:表里有 2 个(高亮行),说明有 2 个以这里结尾、和为 2 的子数组。
结算:答案加 2,变成 4。再把当前前缀和 3 记进表(高亮行,现 1 次),供后面的元素来匹配。
读到第 5 个(1),前缀和变成 4。要找前缀和 = 4−2 = 2:表里有 2 个(高亮行),说明有 2 个以这里结尾、和为 2 的子数组。
结算:答案加 2,变成 6。再把当前前缀和 4 记进表(高亮行,现 1 次),供后面的元素来匹配。
读到第 6 个(0),前缀和变成 4。要找前缀和 = 4−2 = 2:表里有 2 个(高亮行),说明有 2 个以这里结尾、和为 2 的子数组。
结算:答案加 2,变成 8。再把当前前缀和 4 记进表(高亮行,现 2 次),供后面的元素来匹配。
读到第 7 个(1),前缀和变成 5。要找前缀和 = 5−2 = 3:表里有 1 个(高亮行),说明有 1 个以这里结尾、和为 2 的子数组。
结算:答案加 1,变成 9。再把当前前缀和 5 记进表(高亮行,现 1 次),供后面的元素来匹配。
读到第 8 个(0),前缀和变成 5。要找前缀和 = 5−2 = 3:表里有 1 个(高亮行),说明有 1 个以这里结尾、和为 2 的子数组。
结算:答案加 1,变成 10。再把当前前缀和 5 记进表(高亮行,现 2 次),供后面的元素来匹配。
读到第 9 个(1),前缀和变成 6。要找前缀和 = 6−2 = 4:表里有 2 个(高亮行),说明有 2 个以这里结尾、和为 2 的子数组。
结算:答案加 2,变成 12。再把当前前缀和 6 记进表(高亮行,现 1 次),供后面的元素来匹配。
全程扫完,一共数到 12 个和为 2 的连续子数组。靠的是「每到一个位置,就用哈希表 O(1) 查有多少个匹配的旧前缀和」,整体一遍 O(n)。
边界先想清:空数组、全 0 求 goal=0、单元素。
面试常追问滑窗解法与「含负数时谁还成立」。
参考代码
from typing import Listfrom collections import defaultdictclass Solution: def numSubarraysWithSum(self, nums: List[int], goal: int) -> int: count = defaultdict(int) count[0] = 1 prefix = ans = 0 for x in nums: prefix += x ans += count[prefix - goal] count[prefix] += 1 return ans复杂度
- 时间:O(n),一遍遍历,每步哈希查/改 O(1)
- 空间:O(n),哈希表最多存 n+1 种前缀和
易错点
面试追问把动画讲成自己的话
追问这题还有别的 O(n) 解法吗?
追问如果数组含负数,哪种解法还成立?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
和可被 K 整除的子数组
LeetCode 974 · 中等 · 沿着 前缀和套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题