Q525 连续数组(前缀和 + 哈希)

目录
来源:本题是 LeetCode 525,前缀和 + 哈希表的典型应用。这篇是我从 Obsidian 笔记整理过来的第一篇博客文章。
1 一、解题核心转化
1.1 1. 数值映射(关键技巧)
0 → -1,1 → 1
- 子数组 0、1 数目相等 ⇨ 子数组所有元素相加 =
0 - 问题转化:找最长区间和 = 0 的连续子数组
1.2 2. 前缀和公式
$$preSum[r] - preSum[l] = 0 \iff preSum[r] = preSum[l]$$
- 若两个位置前缀和相等:区间 $[l, r-1]$ 和为 0,满足题意
- 区间长度:$r - l$
2 二、易错点:vector 初始化大坑(踩坑记录)
| |
报错原因:vector 实际只有 2 个元素,循环访问
preSum[i+1]下标越界 → heap-buffer-overflow 堆溢出
3 三、算法步骤
- 构造前缀和数组:$preSum[0]=0,preSum[i]=preSum[i-1]+(nums[i-1]==0?-1:1)$
- 哈希表
unordered_map<前缀和, 首次下标>,预先存入:map[0]=0(处理从数组开头就满足条件的子数组) - 遍历前缀和:
- 前缀和未出现:存入哈希(只存第一次下标,保证最长区间)
- 前缀和已存在:计算区间长度
i - map[preSum[i]],更新最大值
4 四、C++ 完整 AC 代码
| |
5 五、复杂度分析
- 时间:$O(n)$,两次线性遍历
- 空间:$O(n)$,前缀和数组 + 哈希表
6 六、同类题型总结(前缀和 + 哈希通用模板)
- LeetCode560 和为 K 的子数组:
pre[r] - pre[l] = K - LeetCode974 和可被 K 整除子数组:同余前缀和配对
通用套路:前缀和做差转化区间条件 + 哈希存首次下标
7 七、精简优化版(不开前缀和数组,原地累加 sum 省空间)
| |