031 连续数组
题目描述:

1.1 解法一:暴力解法
暴力解法就是枚举所有的子数组,然后判断子数组是否满足要求。
1.2 解法二:前缀和在哈希表中
将 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] 的位置。因此,我们仅需用一个哈希表,一边求当前位置的前缀和,一边记录第一次出现该前缀和的位置。
1.3 算法实现
1.3.1 C++ 实现
class Solution {
public:
int findMaxLength(vector<int>& nums) {
unordered_map <int,int> hash; // 创建哈希,统计前缀和出现的位置
hash[0] = -1; // 默认有一个前缀和为 0 的情况
int sum = 0, ret = 0; // ret 标记最终长度
for(int i = 0; i < nums.size(); ++i) {
sum += nums[i] == 0 ? -1 : 1; // 三目表达式判断一下,是 0 就 -1
(hash.(sum)) {
ret = (ret, i - hash[sum]);
} {
hash[sum] = i;
}
}
ret;
}
};








