🎓 小结给学生的话术:
“你每次从左往右加钱,比如加到 5 块,看一看这些钱是不是正好是全部钱的一半,如果是,那你就分得很公平,就是平衡的。如果一直都不是一半,那就永远不会平衡。”
🔍 什么是“前缀和”?
前缀和的意思是:从序列的开头开始,依次累加起来的和。
比如序列:1 2 3 4
它的前缀和分别是:
- 第1项前缀和:1
- 第2项前缀和:1+2=3
- 第3项前缀和:1+2+3=6
- 第4项前缀和:1+2+3+4=10
用公式写就是:
cpp
复制编辑
sum[i] = a[0] + a[1] + ... + a[i]
📌 题目要求什么?
题目说:找一个位置 i,使得左边的和等于右边的和。
举个例子:
cpp
复制编辑
a = [1, 2, 3]
↑
i = 2
左边:a[0] + a[1] = 1 + 2 = 3
右边:a[2] = 3
→ 左右相等 → 平衡
🧠 这和前缀和有什么关系?
我们不想每次都重新算“前 i 项的和”和“后面的和”。那就考虑:
- 整个序列的总和我们可以提前一次性算好。
- 从左往右依次加,加到第 i 项的和我们就称为前缀和(sum)。
此时:
- 如果
sum * 2 == total,说明这一段是整个序列的一半 → 说明找到了平衡点。
✅ 所以用“前缀和”的好处是:
- 每次只用加一项就能更新前缀和
sum += a[i] - 判断是否满足条件只需要
sum * 2 == total - 整个过程一次遍历就能完成,效率非常高!
🧾 简化理解方式(给学生讲):
你可以这样和学生解释:
“我们在数钱,如果你从左边加钱,加到某个位置刚好是一半,那你也就找到了一个‘平衡点’。所以我们一边走一边加钱(前缀和),再比较是不是刚好占了全部的一半,就能知道答案。”
🧩 题目 1:是否存在一个位置使左右相等(入门题)
【题目描述】
给定一个长度为 n 的正整数序列 a,判断是否存在一个位置 i(1 ≤ i < n),使得前 i 个数的和等于后面所有数的和。
(也就是你刚做的“平衡序列”的题)
🧩 题目 2:统计前缀和等于某个值的次数
【题目描述】
输入一个长度为 n 的序列 a,还有一个目标值 x。请你统计从第一个数开始往后加,每次的和正好等于 x 的次数。
【输入样例】
复制编辑
5 6
1 2 3 4 5
【输出样例】
复制编辑
1
【解释】
只有 1+2+3=6 这一次满足。
✅ 练习点:把“从头加到某一项”=前缀和!
🧩 题目 3:找出所有子段和为k的区间数(经典应用)
【题目描述】
给定一个长度为 n 的数组 a 和一个整数 k,求有多少个区间 [i, j] 的和为 k。
【样例输入】
复制编辑
5 5
1 2 3 2 1
【输出样例】
复制编辑
2
【解释】
两个区间满足和为5:[1,2](2+3)和 [0,2](1+2+3)
✅ 练习点:前缀和数组 + 差值法:pre[j+1] - pre[i] = k
🧩 题目 4:最长前缀和为偶数的前缀长度
【题目描述】
给你一个长度为 n 的序列,找出从头开始加起来仍为偶数的最长前缀长度。
【样例输入】
复制编辑
5
1 2 3 5 6
🌟 一、什么时候可以用“前缀和”?
✅口诀:从左往右累加一段和,就想前缀和!
- “从第一个数到某个位置的和”:这就是前缀和
- “判断前几项和等于多少”:也是前缀和
- “多次询问某一段的总和”:更适合用前缀和数组(累加表)
🌟 二、这题怎么联想到前缀和?
我们不是要找一个 i 使得:
复制编辑
前 i 个数的和 == 后面那一段的和
那你是不是就可以这样想:
bash
复制编辑
设 sum 表示从第一个数加到第 i 个的值
那右边的和 就是 total - sum
如果这两段相等 → sum == total - sum → 2*sum == total
💡注意:你不一定要提前想到“我这题就是用前缀和” ,你只要一看到“从开头到某个点的和”这种结构,就能立刻想到“这是在考我会不会从左到右累加”,这其实就是前缀和思想!
🌟 三、我怎么才能更容易想到前缀和?
✅方法1:练习法
在刷题时,凡是出现这些字眼,马上心里响起“前缀和警报🚨”:
- “某一段的和”
- “第1到第i个数”
- “连续区间和等于XX”
- “能不能找到一段和满足XX条件?”
✅方法2:替换法
把“题目里的一段”换成“前缀和”,比如:
- “前i个数的和” = pre[i]
- “后n-i个数的和” = total - pre[i]
让自己在纸上写写这些替换过程,越写越熟,越熟越自然!
🧠 补一句理解总结
“前缀和”其实就是边加边判断,和我们小时候数零钱是一模一样的,只不过它帮我们抽象成了代码里的一个累加过程。
✅ 最实用的一句口诀:
只要你从头加数判断某一段,那你就是在用前缀和的思想!
【输出样例】
复制编辑
3
【解释】
前缀和为:1,1+2=3,1+2+3=6 ✅,1+2+3+5=11 ❌,所以最长为3
✅ 练习点:每次累加后判断条件,属于前缀和“思想”
🧩 题目 5(挑战题):是否可以分成两个前缀和为偶数的段
【题目描述】
给定一个长度为 n 的数组,是否可以在某个位置 i 分成 [0~i] 和 [i+1~n-1] 两段,使得这两段的和都是偶数。
【输入样例】
复制编辑
4
2 4 6 2
【输出样例】
yaml
复制编辑
Yes
【解释】
前缀1:2+4=6 ✅
后缀2:6+2=8 ✅
✅ 练习点:思考左右两个前缀和是否都是偶数,用总和和当前前缀和结合判断。
✅ 建议练习方式
| 方式 | 内容 |
|---|---|
| 🖊 纸上演算 | 自己写出每一步前缀和 |
| 💻 编码训练 | 用 sum += a[i] 的方式实现每个题 |
| 🧠 思维联想 | 看到“从头加一段”就想“是不是前缀和” |