• LeetCode 525.连续数组


      最近偶然碰到的一道题,题目本身解法不难,但属于挺典型的数组问题处理的一种解法。

      该题是利用前缀和的技巧判断子数组合法性的。(另外一些常用于判断数组合法性的典型方法有双指针法即尺取,二分枚举区间等。)

    题目:

    给定一个二进制数组, 找到含有相同数量的 0 和 1 的最长连续子数组。

    示例 1:

    输入: [0,1]
    输出: 2
    说明: [0, 1] 是具有相同数量0和1的最长连续子数组。

    示例 2:

    输入: [0,1,0]
    输出: 2
    说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。

    注意: 给定的二进制数组的长度不会超过50000。

    题解:

       首先对原数组做处理,将所有的0都变为-1;这样一来 “含有相同数量的 0 和 1 的连续数组” 就等价为 “元素值总和为0的连续数组”。

        其后,从头扫一遍数组,并记录当前的前缀和的值,将该值和对应的下标存入到一个标记数组或哈希表中。若该前缀和的值已出现过(即标记数组或哈希中已存在),则说明标记中的下标到当前扫描的下标的这段数组的总和值是为0的。

        打个例子: [ -1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1 ] 在扫描完到第四个元素时,前缀和为-2 且未记录过,则将值-2和下标3记录起来。当扫描到  [ -1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1 ]  , 此时得到的前缀和为-2,且知道标记中有记录过-2,则说明此刻下标到之前记录的下标的这段数组总和为0  [ -1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1 ]  。

     1 class Solution {
     2     public int findMaxLength(int[] nums) {
     3         int ans = 0,sum = 0;
     4         for(int i=0;i<nums.length;i++)if(nums[i]==0)nums[i]=-1;
     5         HashMap<Integer,Integer> map = new HashMap();
     6         for(int i=0;i<nums.length;i++) {
     7             sum+=nums[i];
     8             if(sum == 0) { if(i >= ans) ans = i+1; }
     9             if(map.get(sum) == null) { map.put(sum,i); continue; }
    10             int temp = i - map.get(sum);
    11             if(temp > ans) ans=temp;
    12         }
    13         return ans;
    14     }
    15 }
  • 相关阅读:
    zabbix监控部署(三)
    zabbix监控部署(二)
    zabbix监控部署(一)
    Docker安装mysql5.7
    Docker修改容器默认存储路径
    MySQL全量+增量备份脚本
    企业级Dokcer镜像仓库Harbor部署
    Linux环境pyhon3安装pyinstaller
    配置Hive元数据数据库为PostgreSQL
    Oracle 11gR2 RAC 添加节点
  • 原文地址:https://www.cnblogs.com/geek1116/p/9389236.html
Copyright © 2020-2023  润新知