485 最大连续 1 的个数
题目
题目链接:485 最大连续 1 的个数
给定一个二进制数组, 计算其中最大连续 1 的个数。
示例:
输入:[1,1,0,1,1,1]
输出:3
解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.
提示:
输入的数组只包含 0 和 1 。
输入数组的长度是正整数,且不超过 10,000。
思路
- 快慢指针
- 初始化一个快指针
fast
和一个慢指针slow
; fast
:每次都向前移动一步;slow
:只有当fast
指向 0 时,才移动到fast
的位置,并在此时更新「连续 1 的个数」。
- 初始化一个快指针
- 需要注意:
- 初始化
slow
时,指向索引-1
,而不是索引0
。因为在更新slow
时是直接跳到fast
,即下一个 0 的位置。因此,如果数组第一个元素是 1,并将slow
指向索引0
就不合适。 - 当
fast
在数组中部(还未到尾元素)时,更新「连续 1 的个数」应该是:fast - slow - 1
。即「上一个 0」到「下一个 0」的长度 - 1
,长度需要-1
。 - 当
fast
到达数组尾元素时(即跳出循环),应当再判断一次,此时,「连续 1 的个数」应该是:fast - slow
,即「最后一个 1」到「上一个 0」的长度
,长度不用-1
。
- 初始化
代码
class Solution:
def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
res = 0
slow = -1
for fast in range(len(nums)):
if nums[fast] == 0:
res = max(res, fast-slow-1)
slow = fast
# fast 指针走到数组最后一个元素时,也需要判断一次
res = max(res, fast-slow)
return res
分析
- 时间复杂度需要
O(n)
来遍历数组。 - 空间复杂度需要
O(1)
来保存指针。
留下评论