525. 连续数组
难度:中等
语言:java
题目内容
给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。
解法思路
开始写了个解法,以为是必须01不间隔的,发现01可以间隔着来,只要在一段范围内数量相等就可以了。
我开始还想着,如果和是长度的两倍就可以算,原来有更好的办法,直接把0算作-1,如果一部分的和为0,则这部分是连续子数组,就又回到了昨天的问题了,前缀和,哈希表。
class Solution {
public int findMaxLength(int[] nums) {
int n = nums.length;
int[] sum = new int[n + 1];
for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + (nums[i - 1] == 1 ? 1 : -1); // 简化写法,还不错
Map<Integer,Integer> map = new HashMap<>();
int ans = 0;
for (int i = 0; i<=n;i++){
if (map.containsKey(sum[i])) {
ans = Math.max(ans, i - map.get(sum[i])); //只要前缀和相等,就证明找到了,并且因为永远要找最大的,那最先放进来的,和当前前缀和相同的值肯定就是相等的
}
else{
map.put(sum[i],i); // 没有当前的前缀和,放入哈希表
}
}
return ans;
}
}