算法-11未排序数组中累加和为给定值的最长子数组系列问题补2

描述

给定一个无序数组arr,其中元素只能是1或0。求arr所有的子数组中0和1个数相等的最长子数组的长度 
[要求]
时间复杂度为O(n)O(n),空间复杂度为O(n)O(n)

输入描述:

第一行一个整数N,表示数组长度
接下来一行有N个数表示数组中的数

输出描述:

输出一个整数表示答案

示例1

输入:
5
1 0 1 0 1

输出:
4

思路

定义一个平衡因子key,遇到一个1就自增,遇到一个0就自减。遍历数组更新这个平衡因子,用一个哈希表记录0~i位置的平衡因子,我们可以知道对于一段数组arr[0:j],如果它的平衡因子为balance,且存在某个前面的位置i<j,满足arr[0:i]的平衡因子也是balance,这就说明子数组arr[i+1:j]的0和1数量相等,平衡因子归零,可以更新一次长度。

import java.util.Scanner;
import java.util.HashMap;

public class Main{
    
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] arr = new int[n];
        for(int i=0;i<n;i++){
            arr[i] = scanner.nextInt();
        }
        
        HashMap<Integer,Integer> map = new HashMap<>();
        map.put(0,-1);
        int key=0,maxLen=0;
        for(int i=0;i<n;i++){
            key += arr[i]==0?-1:1;
            if(map.containsKey(key)){
                maxLen = Math.max(maxLen,i-map.get(key));
            }else {
                map.put(key,i);
            }
        }
      System.out.println(maxLen);
    }
}

 

posted @ 2022-01-11 15:13  思凡念真  阅读(23)  评论(0编辑  收藏  举报