博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 525.连续数组
阅读量:5357 次
发布时间:2019-06-15

本文共 1143 字,大约阅读时间需要 3 分钟。

 

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

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

 

题目:

给定一个二进制数组, 找到含有相同数量的 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
map = new HashMap(); 6 for(int i=0;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 }

 

转载于:https://www.cnblogs.com/geek1116/p/9389236.html

你可能感兴趣的文章
Oracle session相关数据字典(一)
查看>>
织梦文章内容提取第一张或者多张图片输出
查看>>
C#用正则表达式 获取网页源代码标签的属性或值
查看>>
BZOJ 3399 [Usaco2009 Mar]Sand Castle城堡(贪心)
查看>>
WCF(一) 简单的认知
查看>>
[MFC][DShow]简单例子
查看>>
Luogu P1141 01迷宫【搜索/dfs】By cellur925
查看>>
js onclick事件传参
查看>>
WiCloud 商业Wi-Fi管理平台
查看>>
团队项目--未完待续
查看>>
双重标准,我该怎么解决
查看>>
python中的网页标签等字符处理
查看>>
Mybatis输入类型和结果类型
查看>>
Linux常用命令(五)
查看>>
Linux常用命令(四)
查看>>
Linux常用命令(六)
查看>>
Linux常用命令(六)
查看>>
Linux常用命令(八)
查看>>
Linux常用命令(七)
查看>>
Linux常用命令(九)
查看>>