- 连续数组
给定一个二进制数组 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
思路:前缀和+哈希表,对数组中的0做特殊处理假定为-1,原问题就转化为求最长的连续子数组,其元素和为0,然后计算前缀和可以很快算出一个区间子数组的和,用哈希来存储当前为某一个和的下标,就比如碰到1就++,碰到0就–,哈希表来维护这个和,要注意默认放一个{0,-1}进哈希表,表示空的前缀的结束下标为-1,之后每遍历一个下标就利用哈希表维护,更新最大长度
class Solution {
public int findMaxLength(int[] nums) {
int maxLen = 0;
Map<Integer, Integer> map = new HashMap<>();
int count = 0;
map.put(count, -1);
int n = nums.length;
for(int i = 0; i < n; i++){
int num = nums[i];
if(num == 1){
count++;
}else{
count--;
}
if(map.containsKey(count)){
int prevIndex = map.get(count);
maxLen = Math.max(maxLen, i - prevIndex);
}else{
map.put(count, i);
}
}
return maxLen;
}
}