题目
- 链接
- 描述
给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。
也就是说给定的数组全是 0 和 1 组成的。
- 输入与输出
- 输入: nums = [0,1]
- 输出: 2
- 说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组
思路
首先要明确给定的是 二进制数组,要想 0 和 1 个数相同的连续的子数组,那么就可以把 0 换成 -1,然后相加,如果相加结果为 0,说明该子数组 0 和 1 的个数相同。
- 暴力解法
单纯的替换 0 和 1;
- 哈希表优化
注意:求的是连续子数组的 长度。
哈希表中,key 代表当前和,value 代表下标。
代码
class Solution {
public int findMaxLength(int[] nums) {
int res = 0;
for (int i = 0; i < nums.length; i++) {
int sum = nums[i] == 0 ? -1 : 1;
for (int j = i+1; j < nums.length; j++) {
int tmp = nums[j] == 0 ? -1 : 1;
sum += tmp;
if (sum == 0 && j-i+1 > res) {
res = j-i+1;
}
}
}
return res;
}
}
- 哈希表 + 前缀和
class Solution {
public int findMaxLength(int[] nums) {
int res = 0;
Map<Integer,Integer> map = new HashMap<>();
map.put(0,-1);
int sum = 0;
for (int i = 0; i < nums.length; i++) {
int tmp = nums[i] == 0 ? -1 : 1;
sum += tmp;
if (map.containsKey(sum)) {
res = Math.max(res,i-map.get(sum));
}else {
map.put(sum,i);
}
}
return res;
}
}