class Solution {
public int findMaxLength(int[] nums) {
int N = nums.length;
Map<Integer, Integer> sumMap = new HashMap<Integer, Integer>();
sumMap.put(0, -1); //这里的逻辑是这样的,正常我们的位置是1,2,3,但是在数组中其实是0,1,2,因此,为了正确计数,我们在这里将起始位置变成了-1
//这个是计算数组的和,当出现1时,sum+1,当出现0时,sum-1
//这里之所以将出现的0记为-1,就是为了方便我们的计算,因为这样得到的结果就是0
int sum = 0;
int maxLen = 0; //最终需要的结果
for(int i = 0; i < N; i++){
sum += nums[i] == 1? 1 : -1;
int key = sum;
if(sumMap.containsKey(key)){
//i - sumMap.get(sum)是这样理解的
//sumMap.get(sum),在nums数组中,截取前i个作为子数组,该子数组的和记为a
//而在第j个位置,也就是当前位置,又出现了和值为a的情况
//这就意味着,i+1到j之间的和值为0,也就是我们需要的结果
//这个时候,我们需要知道的就是i+1到j之间的长度,是否超过了已经存储的maxLen
maxLen = Math.max(maxLen, i - sumMap.get(sum));
}else{
//记录出现该数字时,对应的子数组长度
sumMap.put(sum, i);
}
}
return maxLen;
}
}