525. 连续数组 - 力扣(LeetCode)
思路:前缀和 + 哈希表
转化:将 0 ——> -1
转变为:找到和为0的最长子数组
细节:
1.哈希表存什么
前缀和 , 长度
2.什么时候存入哈希表
先处理前一个,再将当前值存入哈希表
3.如果哈希表中已经有sum,还要存进去吗?
不用,因为算和为0长度时,sum越小,算的长度越长。
4.前缀和为0的情况,怎么处理?
第 i 个元素的前缀和正好是 sum ,那么前面子数组就是0的长度就是-1
hash[0] = -1
5.长度怎么算
和为0的子数组长度:i - j;
class Solution
{
public:int findMaxLength(vector<int>& nums) {//前缀和,长度unordered_map<int,int> hash;hash[0] = -1;int n = nums.size(),sum = 0,len = 0;for(int i = 0;i < n;i++){if(nums[i] == 0)nums[i] = -1;sum += nums[i];if(hash.count(sum))//len算的就是子数组的长度len = max(len,i - hash[sum]);elsehash[sum] = i; }return len;}
};
注意:len是子数组的长度,哈希表里存sum的长度。