[LeetCode] 525. 连续数组
Posted ACBingo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 525. 连续数组相关的知识,希望对你有一定的参考价值。
我会把前缀和+HashMap刻在我的DNA里。
子数组中0的个数和1的个数相同。其实可以让0变成-1,那么问题是变成了子数组中和为0即满足题意。
sum[i]为前缀和。
如果sum[j] - sum[i] = 0,那么区间[i+1,j]构成的子数组即满足题意。
我们将<sum[i],i>的对应关系存到HashMap里,每当遍历到j时,利用HashMap判断之前存不存在过sum[j],存在就将第一次出现的i取出(因为要保证区间最长),更新最值既可。
class Solution {
public int findMaxLength(int[] nums) {
int n = nums.length;
int[] sum = new int[n];
for (int i=0;i<n;i++) {
if (nums[i] == 0) {
nums[i] = -1;
}
}
Map<Integer, Integer> map = new HashMap<>();
sum[0] = nums[0];
map.put(sum[0], 0);
map.put(0,-1);
int ans = 0;
for (int i=1;i<n;i++) {
sum[i] = sum[i-1] + nums[i];
if (map.get(sum[i])!=null) {
ans = Math.max(ans, i - map.get(sum[i]));
} else {
map.put(sum[i], i);
}
}
return ans;
}
}
以上是关于[LeetCode] 525. 连续数组的主要内容,如果未能解决你的问题,请参考以下文章