算法练习第35题-最大连续1的个数

302 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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)

四、测试用例

测试用例1

image.png

测试用例2

image.png