前缀和算法实战:连续数组与矩阵区域和
031 连续数组
题目链接: 525. 连续数组
问题描述
给定一个二进制数组 nums,找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。

解题思路
暴力枚举所有子数组的时间复杂度为 O(n²),在数据量较大时容易超时。我们可以利用前缀和结合哈希表将时间复杂度优化至 O(n)。
核心转化思想如下:
- 如果将数组中的 0 记为 -1,1 记为 1,那么问题就转化为寻找一段区间,其元素之和等于 0。
- 设
sum[i]表示从索引 0 到 i 的前缀和。若存在两个位置i和j(假设i < j),使得sum[j] - sum[i] = 0,即sum[j] == sum[i],则说明区间[i+1, j]内的元素和为 0。 - 为了得到最长子数组,我们需要记录每个前缀和第一次出现的位置。当再次遇到相同的前缀和时,用当前位置减去首次出现的位置即可得到长度。
代码实现
C++ 实现
class Solution {
public:
int findMaxLength(vector<int>& nums) {
unordered_map<int, int> hash;
// 初始化前缀和为 0 的位置为 -1,处理从索引 0 开始的子数组
hash[0] = -1;
int sum = 0;
int ret = 0;
for (int i = 0; i < nums.size(); ++i) {
// 0 视为 -1,1 视为 1
sum += (nums[i] == 0 ? -1 : );
(hash.(sum)) {
ret = (ret, i - hash[sum]);
} {
hash[sum] = i;
}
}
ret;
}
};


