剑指 Offer II 011. 0 和 1 个数相同的子数组
题目描述
给定一个二进制数组 nums
, 找到含有相同数量的 0
和 1
的最长连续子数组,并返回该子数组的长度。
示例 1:
输入: nums = [0,1]
输出: 2
说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。
示例 2:
输入: nums = [0,1,0]
输出: 2
说明: [0, 1] (或 [1, 0]) 是具有相同数量 0 和 1 的最长连续子数组。
提示:
1 <= nums.length <= 105
nums[i]
不是0
就是1
思路解析
1.这道题和前面一道题的思路类似
2.前缀和,这里直接用一个cnt来保存1比0多出来的个数
3.每次找到一个1,就把cnt+1,否则-1个,对冲1和0的个数
4.当前位置的1比0多出来的个数算出来就是cnt,那么找到距离他最远的有相同cnt的个数的idx,然后相减就可以得到一个距离,这个距离内0和1的个数是相等的
5.然后比较最大的长度,如果没有这个cnt,那么吧当前的下标idx记录下来
代码实现
class Solution {
public int findMaxLength(int[] nums) {
int max = 0;
// 记录1比0多的数
int cnt = 0;
Map<Integer,Integer> map = new HashMap<>();
// 前缀和需要保存初始值
map.put(0,-1);
for(int i = 0;i<nums.length;i++) {
// 每次如果有一个1,计数器+1,否则-1
if(nums[i]==1) {
cnt++;
}else {
cnt--;
}
// 当前位置的1比0多的个数是cnt个,那么找到最远的个1比0多个个数是cnt个的位置,然后当前位置减去这个位置
if(map.get(cnt)!=null) {
max = Math.max(max,i-map.get(cnt));
}else {
map.put(cnt,i);
}
}
return max;
}
}
欢迎大佬们关注小弟的博客https://blog.csdn.net/qq_41522089