• 算法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);
        }
    }
  • 相关阅读:
    C++指针和引用及区别
    C/C++中extern关键字总结
    php进阶面试题总结
    算法疑难(js实现)---11、字典树
    Trie|如何用字典树实现搜索引擎的关键词提示功能
    ExtJS表格——行号、复选框、选择模型
    Ext.js 中 25种类型的Ext.panel.Tool
    Ext NumberField使用
    [ext]form.submit()相关说明
    ExtJS 表单 submit时错误处理
  • 原文地址:https://www.cnblogs.com/sfnz/p/15788451.html
Copyright © 2020-2023  润新知