
求解代码
java
public int findMaxLength(int[] nums) {
int ans = 0;
int sum = 0;
HashMap<Integer,Integer> hMap = new HashMap<>();
hMap.put(0, -1);
for(int i=0;i<nums.length;i++){
sum+=(nums[i]==0?-1:1);
if(hMap.containsKey(sum)){
ans=Math.max(ans, i-hMap.get(sum));
}else{
hMap.put(sum, i);
}
}
return ans;
}
小贴士
这道题关键在于把0转为-1,1保持1,将问题转化为"找和为0的最长子数组"。
解释一下这行代码:
bash
map.put(0, -1);
假设从数组起始位置(下标 0)到下标 i 的前缀和为 0,说明 [0, i] 区间内 0 和 1 数量相等,此时子数组长度就是 i - (-1) = i + 1