[题目链接](剑指 Offer II 011. 0 和 1 个数相同的子数组 - 力扣(LeetCode) (leetcode-cn.com))
思路
-
先进行预处理,若数组元素等于0时,将该数组元素变为-1。这样求含有相同数量的
0
和1
的最长连续子数组的问题就变成了找到子数组和为0的最长连续子数组,该问题就变成了和[第十题](剑指 Offer II 010. 和为 k 的子数组 - 力扣(LeetCode) (leetcode-cn.com))一样的问题。 -
ans = Math.max(ans,i+1-sum.get(summ)); //若当前前数组和为summ,前子数组和为summ的长度为sum.get(summ),剩下的前子数组和为0的长度即为i+1-sum.get(summ)
代码
class Solution {
public int findMaxLength(int[] nums) {
int ans = 0;
for(int i = 0; i < nums.length; i++) {
if(nums[i] == 0) nums[i] = -1;
}
Map<Integer,Integer> sum = new HashMap<Integer,Integer>();
sum.put(0,0);//!初始化0,-1
int summ = 0;
for(int i = 0; i < nums.length; i++) {
summ += nums[i];
if(sum.containsKey(summ)) {
ans = Math.max(ans,i+1-sum.get(summ));
} else sum.put(summ,i+1);
}
return ans;
}
}
Java知识
HashMap
判断该Map中是否存在键值对(Key,Value)
if(sum.containsKey(summ))