每日一题系列-leetcode-525-连续数组

区块链涟漪
• 阅读 1887

leetcode-525-连续数组

<!--more-->

[题目描述]

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



 示例 1: 


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

 示例 2: 


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



 提示: 


 1 <= nums.length <= 105 
 nums[i] 不是 0 就是 1 

 Related Topics 哈希表 
 👍 293 👎 0

[题目链接]

leetcode题目链接

[github地址]

代码链接

[思路介绍]

思路一:暴力法(这种方法没什么意义,遍历所有子数组)

时间复杂度(O(n^2^))


思路二:hash表

  • 由于数组中只有0 1 两个元素,当子元素长度为n(n为正偶数)时,子数组和为(n/2)
  • 所以可以把0换成-1 这样 子数组和即为0,题意转化成了求连续子数组和为0的最大长度子数组
  • 最近做的两道题都有这种思想,通过前缀和求连续区间
  • 相关题目链接leetcode-523-连续子数组和
  • 每日一题系列
  • 也就是说连续子数组长度则可以通过前缀和的差值来判断
  • 首先定义一个prefix[]数组 prefix[i] = nums[0] +……+ nums[i]
  • nums[i] +……+ nums[j] = prefix[j] - prefix[i-1]
  • 如果只是这样计算每一个子数组的和其实和暴力法没有区别甚至是多了O(n)的时间复杂度
  • 可以根据题目含义得出,目标是求出prefix[j] - prefix[i]== 0的时候 j 与 i的最大差值
  • 也就是说需要求得使prefix[j]与prefix[i]相等情况j 与 i差值最大
  • 因此可以考虑引入hashmap进行计算,将prefix[i]的值作为key存入hashmap并记录当前坐标为value
    每次求出前缀和的时候判断求Math.max(j-i)
 public int findMaxLength(int[] nums) {
            int n = nums.length,max = 0;
            Map<Integer,Integer> map = new HashMap<>();
            int[] prefix = new int[n];
            prefix[0] = (nums[0] == 0 ? -1 : 1);
            map.put(prefix[0],0);
            //求前缀和数组
            for (int i = 1; i < n; i++) {
                prefix[i] = prefix[i - 1] + (nums[i] == 0 ? -1 : 1);
                //当前前缀和已经满足,则进入计算范围
                if (prefix[i] == 0){
                    max = Math.max(i+1,max);
                }
                if (map.containsKey(prefix[i])){
                    max = Math.max(i-map.get(prefix[i]),max);
                }else{
                    map.put(prefix[i], i);
                }
            }
            return max;
        }

时间复杂度O(n)

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
4年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
胡哥有话说 胡哥有话说
5年前
面试官在“逗”你系列:连续子数组的最大和或最小和
前言本文题目是“连续子数组的最大和或最小和”。话不多说,开始“打怪”修炼...一、理解题目以“连续子数组的最大和”为例,相当于我们在数组中,计算连续的子数组的和,找寻最大值。如在数组3,2,1,2,4,6,5中连续子数组的最大和为:3(2)1248输入:3,2,1,2,4,6,
孤心独饮 孤心独饮
5年前
从零开始刷力扣(一)——485:最大连续1的个数
分类:数组的遍历题目描述:给定一个二进制数组,计算其中最大连续1的个数。示例1:输入:1,1,0,1,1,1输出:3解释:开头的两位和最后的三位都是连续1,所以最大连续1的个数是3.思路初始化count和maxCount,然后遍历数组,遇见1则count,并且更新与maxCount比较,若比maxCount更大,则更新m
Wesley13 Wesley13
4年前
Java开发者容易犯的十个错误
!(https://oscimg.oschina.net/oscnet/c9f00cc918684fbe8a865119d104090b.gif)Top1.数组转换为数组列表将数组转换为数组列表,开发者经常会这样做:\java\List<StringlistArrays.asList(arr);Arr
Stella981 Stella981
4年前
LeetCode 5561. 获取生成数组中的最大值
文章目录1\.题目2\.解题1\.题目给你一个整数n。按下述规则生成一个长度为n1的数组nums:nums00nums11当2<2i<n时,nums2inumsi
Wesley13 Wesley13
4年前
ES6 新增的数组的方法
给定一个数组letlist\//wu:武力zhi:智力{id:1,name:'张飞',wu:97,zhi:10},{id:2,name:'诸葛亮',wu:55,zhi:99},{id:3,name:'赵云',wu:97,zhi:66},{id:4,na
达里尔 达里尔
2年前
给数组添加新数据,判断数据是否重复
多选要进行数组拼接,希望判断往原数组里添的新数据是否重复,封装个简易方法languageconstdataArrayname:'aaa',id:1,name:'bbb',id:2;constnewDataname:'ccc',id:2;//要添加的新数