前缀和思想练习题

63 阅读5分钟

🎓 小结给学生的话术:

“你每次从左往右加钱,比如加到 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 项的和”和“后面的和”。那就考虑:

  1. 整个序列的总和我们可以提前一次性算好。
  2. 从左往右依次加,加到第 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] 的方式实现每个题
🧠 思维联想看到“从头加一段”就想“是不是前缀和”