每天做个总结吧,坚持就是胜利!
/**
@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,可惜没有做出来,能力有限,慢慢成长。
看了题解后总结一下。
叁(题意)
可以转变一下思想,找0和1数量相同的子数组,其实相当于找相加为0的子数组;
首先需要定义map,map的第一个值是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;
}