525. 连续数组

 

 方法一:记录0的个数减1的个数有没有出现过

class Solution {
    public int findMaxLength(int[] nums) {
        int n = nums.length;
        Map<Integer,Integer> map = new HashMap<>();
        map.put(0,0);
        int num0 = 0, num1 = 0, res = 0;
        for(int i = 0; i < n; i++) {
            if(nums[i] == 0) num0++;
            else num1++;
            if(map.containsKey(num0-num1)) {
                res = Math.max(res,i-map.get(num0-num1)+1);
            } else {
                map.put(num0-num1,i+1);
            }
        }
        return res;
    }
}

方法二:将0用-1替换,问题转换为求和为0的最长子区间

class Solution {
    public int findMaxLength(int[] nums) {
        int n = nums.length;
        for(int i = 0; i < n; i++) if(nums[i] == 0) nums[i] = -1;
        Map<Integer,Integer> map = new HashMap<>();
        map.put(0,0);
        int sum = 0, res = 0;
        for(int i = 0; i < n; i++) {
            sum += nums[i];
            if(map.containsKey(sum)) {
                res = Math.max(res,i - map.get(sum) + 1);
            } else {
                map.put(sum,i+1);
            }
        }
        return res;
    }
}

 

posted @ 2020-08-18 15:37  Sexyomaru  阅读(124)  评论(0编辑  收藏  举报