[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取出(因为要保证区间最长),更新最值既可。

525. 连续数组

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;
    }
}
posted @ 2021-06-06 23:42  ACBingo  阅读(24)  评论(0编辑  收藏  举报