返回

二进制数组中的最大连续“1”

前端

算法奇遇记:探索二进制数组中的连续“1”

前情提要

朋友们,欢迎回到我们的算法奇遇记。上期,我们探索了算法的奥秘,将一串混乱的数据转变为井然有序的结构。今天,我们将踏上新的征程,探寻二进制数组中的连续“1”数目。

背景故事

想象一下,你有一串由 0 和 1 构成的二进制数组。你的任务是找到这个数组中连续出现的最多“1”的个数。例如,对于数组 [1,1,0,1,1,1],连续出现的最多“1”的个数是 3。

算法攻略

为了解决这一难题,我们采用以下策略:

  1. 定义滑动窗口: 我们创建一个窗口,初始长度为 1,从数组的第一个元素开始向后滑动。
  2. 更新窗口: 每次滑动时,我们检查窗口中“1”的个数。如果当前窗口中的“1”的个数大于最大值,我们就更新最大值。
  3. 增加窗口: 如果窗口中的“1”的个数小于最大值,我们就将窗口右边界向右移动一个单位。
  4. 重复以上步骤: 我们持续重复以上步骤,直到窗口滑到数组的最后一个元素。

具体实现

def max_consecutive_ones(nums):
  max_ones = 0  # 最大连续“1”的个数
  current_ones = 0  # 当前窗口中连续“1”的个数
  left = 0  # 窗口左边界
  right = 0  # 窗口右边界

  while right < len(nums):
    if nums[right] == 1:
      current_ones += 1
    else:
      max_ones = max(max_ones, current_ones)
      current_ones = 0
      left = right + 1

    right += 1

  max_ones = max(max_ones, current_ones)  # 处理数组最后一个窗口

  return max_ones

代码解析

该算法首先初始化三个变量:max_ones 存储最大连续“1”的个数,current_ones 存储当前窗口中连续“1”的个数,leftright 存储窗口的左右边界。

然后,算法进入一个循环,循环遍历数组。每次循环,它检查窗口中“1”的个数是否大于 max_ones,如果是,则更新 max_ones。如果窗口中“1”的个数小于 max_ones,则更新窗口边界,向右移动一个单位。

循环结束后,算法返回 max_ones,表示数组中连续出现的最多“1”的个数。

算法分析

该算法的时间复杂度为 O(n),其中 n 是数组的长度。它一次遍历整个数组,每次迭代花费常数时间。

结语

朋友们,这就是算法奇遇记的又一章。我们探索了连续“1”的奥秘,并编写了一个有效的算法来解决这一问题。我希望这篇文章能让你对算法和计算机科学的迷人世界更加感兴趣。

让我们继续踏上探索的征程,期待下一次的算法冒险!