华为 OD 训练营 · 题解精讲
LC485. 最大连续 1 的个数
题目描述
给定一个二进制数组 nums , 计算其中最大连续 1 的个数。 示例 1: 输入:nums = [1,1,0,1,1,1] 输出:3 解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3. 示例 2: 输入:nums = [1,0,1,1,0,1] 输出:2 提示: 1 <= nums.length <= 10^5 nums[i] 不是 0 就是 1.
题目解析
题目在说什么
这道题给你一个数组,里面只有两种数字:0 和 1。你要找出最长的连续的一段,这段里面全是 1,然后告诉我这个最长段有多少个 1。
比如 [1,1,0,1,1,1],你从前往后看:
- 开头有两个 1 连着(长度 2)
- 遇到 0 断开了
- 后面又有三个 1 连着(长度 3)
所以最长的是 3。
再比如 [1,0,1,1,0,1]:
- 第一个 1 长度 1
- 遇到 0 断掉
- 然后两个 1 连着(长度 2)
- 又遇到 0 断掉
- 最后一个 1 长度 1
最长的是 2。
思路是怎么来的
想象你在数一串糖葫芦上的山楂,山楂是 1,空竹签是 0。你想知道最长的一段连续山楂有多长。
你会怎么做? 你会从第一颗开始数,一边往前走一边数:
- 看到山楂(1),计数器加 1
- 看到空竹签(0),说明这一段山楂结束了,把刚才数的长度记下来,然后计数器归零,重新开始数下一段
- 走完整个糖葫芦后,从所有记下的长度里挑出最大的那个
这个思路就是“遍历 + 计数 + 记录最大值”。 我们不需要记下每一段的长度,只需要在每次遇到 0 或者走到结尾时,把当前计数和之前记录的最大值比一比,留下更大的那个就行。
代码逐步拆解
参考代码(Python 风格,但逻辑通用):
def findMaxConsecutiveOnes(nums):
count = 0 # 用来数当前这一段连续 1 有几个
max_count = 0 # 用来记录到目前为止看到的最长的一段
for num in nums: # 从第一个数字看到最后一个
if num == 1: # 如果当前数字是 1
count += 1 # 计数器加 1
else: # 如果当前数字是 0
# 这一段连续 1 结束了,看看它是不是比之前记录的最长还长
if count > max_count:
max_count = count # 如果是,更新最长记录
count = 0 # 计数器归零,准备数下一段
# 循环结束后,最后一段可能还没跟 max_count 比较过(如果数组最后是 1)
# 所以再比一次
if count > max_count:
max_count = count
return max_count逐行解释:
1. count = 0 —— 准备一个计数器,从 0 开始。 2. max_count = 0 —— 准备一个“历史最高”记录,一开始是 0。 3. for num in nums: —— 从头到尾看每一个数字。 4. if num == 1: —— 如果看到 1,count += 1,继续往下看。 5. else: —— 如果看到 0,说明刚才那一段 1 结束了。
- 先判断
count是否比max_count大,如果是就更新max_count。