题目
题目解析
这个题目意思很明显,就是找出一段连续的子数组,然后让0和1相等,暴力没有试过我用的是前缀和
技巧解析
-
第一步,定义一个 ans 用来存放最优解,定义一个 cur 用来存放 0 和 1 是否相等,然后定义一个 map 来存放 cur 和数组下标
- 为啥要定义一个map,这就是精髓所在了,看下面的场景
- 为啥要定义一个map,这就是精髓所在了,看下面的场景
-
然后开始循环遍历
- 如果是 0 ,cur - 1 ,如果是 1 , cur + 1
- 然后开始判断是否在map中
- 如果在,就现在的下标减去map 中的下标,然后跟 ans 相对比,取最优值
- 如果没有就存到map 中。
-
最后返回 ans。
代码
class Solution {
public int findMaxLength(int[] nums) {
Map<Integer,Integer> map = new HashMap<>();
int l = nums.length;
//存放一个辅助值
map.put(0,-1);
int ans = 0;
int cur = 0;
//开始循环遍历
for(int i=0;i<l;i++){
if(nums[i] == 0){
cur -= 1;
}else{
cur += 1;
}
if(map.containsKey(cur)){
ans = Math.max(ans,i-(map.get(cur)));
}else{
map.put(cur,i);
}
}
return ans;
}
}