一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第22天,点击查看活动详情。
一、题目
给定一个二进制数组 nums , 计算其中最大连续 1 的个数。
示例 1:
输入:nums = [1,1,0,1,1,1]
输出:3
解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.
示例 2:
输入:nums = [1,0,1,1,0,1]
输出:2
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ma… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路
看到题目,是很简单的双指针问题,但是需要注意的是如何计算最大的连续值,由题,可以看出,当遍历为1时计算数值,为0时清空数值最合理。以下是思路
正常的计数器解题思路
- 当前循环遍历的值为1的时候,normalNum自增
- 同时和定义的最大maxNum做比较,最大值赋值给maxNum
- 当循环便利值为0的时候,清空normalNum,设置为0
- 最后return
双指针解题思路
- 遍历数组
- 当快指针遍历的值为0时,慢指针置0
- 当遍历的值为1时,慢指针自增,同时与最初定义的maxNum对比
- 最大的值赋值于maxNum
- 最后return maxNum
三、代码
计数器的代码
let nums = [1,0,1,1,0,1]
let findMaxConsecutiveOnes = function(nums) {
/**
* 正常的计数器
* 当前循环遍历的值为1的时候,normalNum自增
* 同时和定义的最大maxNum做比较,最大值赋值给maxNum
* 当循环便利值为0的时候,清空normalNum,设置为0
* 最后return
* */
let len = nums.length, normalNum = 0, maxNum = 0
for(let i = 0; i < len; i++) {
if(nums[i] != 1 ) {
normalNum = 0
}
if(nums[i] == 1) {
normalNum++
maxNum = Math.max(maxNum, slow)
}
}
return maxNum
}
findMaxConsecutiveOnes(nums)
双指针的代码
let nums = [1,0,1,1,0,1]
let findMaxConsecutiveOnes = function(nums) {
/**
* 双指针
* 遍历数组
* 当快指针遍历的值为0时,慢指针置0
* 当遍历的值为1时,慢指针自增,同时与最初定义的maxNum对比
* 最大的值赋值于maxNum
* 最后return maxNum
* */
let len = nums.length, fast = 0, slow = 0, maxNum = 0
while(fast < len) {
if(nums[fast] != 0) {
slow++
maxNum = Math.max(maxNum, slow)
} else {
slow = 0
}
fast++
}
return maxNum
}
findMaxConsecutiveOnes(nums)