31. 连续数组
题目链接:
题目描述:

题目示例:

解法(前缀和 + 哈希表):
算法思路:
换个角度看这道题,其实很眼熟。
- 本题要求找出一段连续区间,其中 0 和 1 出现的次数相同。
- 如果将 0 记为 -1,1 记为 1,问题就变成了寻找一段区间,其和等于 0。
- 这跟之前做过的'和为 K 的子数组'思路很像。

设 i 为数组中的任意位置,用 sum[i] 表示【0,i】区间内所有元素的和。想知道最大的以 i 结尾且和为 0 的子数组,就要找到从左往右第一个 x1,使得【x1,i】区间内所有元素的和为 0。这意味着【0,x1-1】区间内的和应该等于 sum[i]。
所以问题转化为:在【0,i - 1】区间内,找到第一次出现 sum[i] 的位置即可。
我们不需要真的初始化一个前缀和数组,因为只关心 i 位置之前第一次前缀和等于 sum[i] 的位置。因此,仅需用一个哈希表,一边求当前位置的前缀和,一边记录第一次出现该前缀和的位置。
C++ 算法代码:
class Solution {
public:
int findMaxLength(vector<int>& nums) {
unordered_map<int, int> hash;
int len = 0;
int sum = 0;
hash[0] = -1;
( i = ; i < nums.(); i++) {
(nums[i] == ) {
nums[i] = ;
}
sum += nums[i];
(hash.(sum)) {
len = (len, i - hash[sum]);
} {
hash[sum] = i;
}
}
len;
}
};







