leetcode: 525-连续数组

241 阅读2分钟

每天做个总结吧,坚持就是胜利!

    /**
        @date 2021-06-03
        @description leetcode: 525-连续数组
    */

壹(序)

今天依旧是LeetCode的每日一题(525:连续数组),不过没做出来,看了题解。

贰(题目)

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

示例 1:

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

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

先读懂题意,是找一个最大子数组,子数组满足条件是里面的0和1数量相同;

一看到题目很容易想到是使用hashMap,可惜没有做出来,能力有限,慢慢成长。

看了题解后总结一下。

叁(题意)

可以转变一下思想,找01数量相同的子数组,其实相当于找相加为0的子数组;

首先需要定义mapmap的第一个值是0: -1,这是未遍历数组前,和为0,索引为-1

然后定义一个变量res,表示最后的输出(最长子数组长度),然后定义一个变量counter,然后遍历数组,counter就是计算当前的和(把0看做-1),然后在hashMap中寻找此时有没有对应的值,有的话则比较此时的res当前索引减去hashMap值的大小(能在hashMap中找到此时的和,说明当前这个和在之前出现过,所以是经历了增加然后减小,或者减小然后增加的过程,所以需要去计算是否此时的子数组长度更大),取大的,没有则插入hashMap

代码如下:

const findMaxLength = (nums) => {
    let counter = 0, res = 0, map = new Map();
    
    map.set(0, -1);
    
    for(let i = 0; i< nums.length; i++) {
        counter += nums[i] ? 1 : -1;
        
        if(map.has(counter)) {
            res = Math.max(i - map.get(counter), res);
        } else {
            map.set(counter, i)
        }
    }
    
    return res;
}