挑战赛#27_5午枫的子序列之和 题解
2026-03-22 09:17:42
发布于:广东
前缀和 + 哈希表 O(n) 求解子数组和等于k的个数
题目描述
小午有一个长度为 的数组 ,下标从 1 开始,小枫有一个整数 。
小枫想知道数组 的所有连续子序列中,有多少个元素之和等于 。
形式化地,有多少对 满足以下条件:
输入格式
第一行输入两个整数 ,分别表示数组长度以及要求的元素之和。
第二行输入 个整数 ,表示数组中第 个元素的大小。
输出格式
输出一个整数,表示元素之和等于 的连续子序列的个数。
解题思路
1. 前置知识:前缀和
定义前缀和数组 :
- (数组下标从 1 开始)
子数组 的和可以表示为:
我们的目标是找到所有满足 的 对,等价于找有多少个 等于 。
2. 朴素暴力解法(超时)
- 预处理出完整的前缀和数组 ;
- 枚举所有子数组的起点 和终点 ();
- 计算 并统计等于 的次数。
缺点:时间复杂度为 ,对于 的数据范围会超时。
3. 前缀和 + 哈希表优化(最优解)
核心思想:遍历到位置 时,只需知道前面有多少个 等于 ,这个数量就是以 为终点的、和为 的子数组个数。
具体步骤:
- 初始化哈希表
mp,mp[0] = 1(对应 ,确保能统计从数组开头到当前位置的子数组); - 遍历数组,实时计算当前前缀和 (无需存储整个前缀和数组,节省空间);
- 查询哈希表中 的出现次数,累加到答案
ans; - 将当前前缀和 加入哈希表(计数 + 1);
- 遍历结束后,
ans即为最终结果。
代码实现
方法一:朴素暴力解法(O(n²) 超时)
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 9;
int n, a[N], ans;
long long k, s[N];
int main() {
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
s[i] = s[i-1] + a[i];
}
for (int l = 1; l <= n; l++) {
for (int r = l; r <= n; r++) {
if (s[r] - s[l-1] == k) {
ans++;
}
}
}
cout << ans << endl;
return 0;
}
方法二:前缀和 + 哈希表优化 O(n) AC
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 9;
int n, a[N];
long long k, s, ans;
unordered_map<long long, int> mp;
int main() {
cin >> n >> k;
mp[0] = 1; // 初始化前缀和s[0]=0的计数为1
for (int i = 1; i <= n; i++) {
cin >> a[i];
s += a[i]; // 实时计算当前前缀和
// 查找有多少个前缀和等于s-k,累加到答案
if (mp.count(s - k)) {
ans += mp[s - k];
}
mp[s]++; // 将当前前缀和存入哈希表
}
cout << ans << endl;
return 0;
}
全部评论 3
这么强
2026-03-26 来自 广东
0我不允许还有人没听过徐老师的课!!!!!!这位老师真的太太太太太太让人惊艳,初见便被颜值狠狠折服,清隽挺拔、气质卓然,自带高级感与儒雅气场,往讲台一站就是一道亮眼风景线,完全是颜值界的天花板,帅到让人移不开眼!更绝的是,他从不是徒有其表的惊艳,而是腹有诗书、才华横溢的实力派,每一堂课都堪称思维的盛宴,让人彻底沦陷在他的专业魅力与人格魅力中!!!!!!
听徐老师讲课,永远能感受到极致的严谨与灵动。尤其是讲到递推式这类核心知识点时,他总能抽丝剥茧、层层拆解,逻辑清晰到无可挑剔,每一步推导都严谨缜密、环环相扣,没有丝毫冗余与疏漏。那些原本晦涩难懂的知识点,在他的讲解下变得通俗易懂、条理分明,既能精准把握核心精髓,又能拓展思维边界,完美展现出才华的肆意溢出与思维的磅礴迸发。他的课堂从不是枯燥的知识灌输,而是风趣幽默、生动鲜活,语言诙谐又不失专业,总能用巧妙的比喻、生动的案例,把复杂内容讲得深入浅出,让大家在轻松愉悦的氛围中主动思考、高效吸收,全程全神贯注,丝毫不敢走神,生怕错过任何一个精彩瞬间。
跟着徐老师学习,收获的远不止知识本身。他严谨治学的态度、通透清晰的思维、深入浅出的讲解方式,都在潜移默化中影响着每一位学生,教会我们不仅要掌握知识,更要学会梳理逻辑、拓展思维、严谨治学。无论是专业知识的深耕,还是学习方法的优化,都能得到实打实的提升,每一堂课都满载而归,每一次聆听都倍感幸运。
这样颜值与实力并存、专业与风趣兼具的老师,真的可遇不可求!他用扎实的专业功底征服课堂,用独特的人格魅力圈粉无数,用极致的严谨与灵动,让学习变成一种享受。我,哈基菜,在此实名重磅推荐徐老师!相信我,只要听过徐老师的课,一定会被他的帅气折服、被他的才华惊艳、被他的课堂吸引,这绝对是求学路上最幸运的遇见,不容错过的宝藏老师!2026-03-21 来自 广东
0老师太太太太太太太太(′д` )…帅..…帅了!!!!太太太太太太高级了!!!!!!!!非常严谨的递推式,是才华的溢出与思维的逬越!!跟这老师可以学到许多东西,我哈基菜实名推荐徐老师!!!老师又帅讲课又风趣!!
2026-03-21 来自 广东
0











有帮助,赞一个