LeetCode 485简单数组
最大连续 1 的个数 图解题解
这道题到底在问什么
给定一个二进制数组 nums(元素只有 0 或 1),返回数组中连续 1 的最大个数。
- 输入
- nums = [1,1,0,1,1,1]
- 输出
- 3(末尾那段 1,1,1 最长)
最优解:一步一步想明白
- 3记住这两个变量:cur 是「现在连着几个」,best 是「历史最长几个」。遇 1 加一刷新、遇 0 归零,下面每一帧都在套它。
- 4开始扫描前:当前连续个数 cur=0,历史最长 best=0。指针 i 还没出发。
- 5指针 i 走到下标 0,这一格的值是 1。是 1,当前这段 1 还能接着加长。
- 6是 1:当前连续个数 cur 加一变成 1(高亮的就是正连着的这段 1)。用它刷新历史最长,best = 1。
- 7指针 i 走到下标 1,这一格的值是 1。是 1,当前这段 1 还能接着加长。
- 8是 1:当前连续个数 cur 加一变成 2(高亮的就是正连着的这段 1)。用它刷新历史最长,best = 2。
- 9指针 i 走到下标 2,这一格的值是 0。是 0,当前这段 1 到此为止,要把 cur 归零。
- 10是 0:当前这段 1 被打断,cur 立刻归零(标红的就是这个 0)。best 不受影响,仍是 2。
- 11指针 i 走到下标 3,这一格的值是 1。是 1,当前这段 1 还能接着加长。
- 12是 1:当前连续个数 cur 加一变成 1(高亮的就是正连着的这段 1)。用它刷新历史最长,best = 2。
- 13指针 i 走到下标 4,这一格的值是 1。是 1,当前这段 1 还能接着加长。
- 14是 1:当前连续个数 cur 加一变成 2(高亮的就是正连着的这段 1)。用它刷新历史最长,best = 2。
- 15指针 i 走到下标 5,这一格的值是 1。是 1,当前这段 1 还能接着加长。
- 16是 1:当前连续个数 cur 加一变成 3(高亮的就是正连着的这段 1)。用它刷新历史最长,best = 3。
- 17指针 i 走到下标 6,这一格的值是 0。是 0,当前这段 1 到此为止,要把 cur 归零。
- 18是 0:当前这段 1 被打断,cur 立刻归零(标红的就是这个 0)。best 不受影响,仍是 3。
- 19指针 i 走到下标 7,这一格的值是 1。是 1,当前这段 1 还能接着加长。
- 20是 1:当前连续个数 cur 加一变成 1(高亮的就是正连着的这段 1)。用它刷新历史最长,best = 3。
- 21指针 i 走到下标 8,这一格的值是 1。是 1,当前这段 1 还能接着加长。
- 22是 1:当前连续个数 cur 加一变成 2(高亮的就是正连着的这段 1)。用它刷新历史最长,best = 3。
- 23指针 i 走到下标 9,这一格的值是 1。是 1,当前这段 1 还能接着加长。
- 24是 1:当前连续个数 cur 加一变成 3(高亮的就是正连着的这段 1)。用它刷新历史最长,best = 3。
- 25扫到末尾,整趟里最长的一段连续 1 是高亮的这 3 个,best=3 就是最终答案。
⚠️ 容易写错的地方
✗ 错:遇 0 时忘了把 cur 归零
✓ 对:遇 0 立刻 cur = 0
不归零会把被 0 隔开的两段 1 误当成连着的,算出偏大的结果
✗ 错:只在遇 0 时才更新 best
✓ 对:每次 cur 加一后就 max 刷新 best
若数组以 1 结尾,最后那段最长的 1 后面没有 0,靠遇 0 更新会漏掉它
✗ 错:用一个变量边加边比、结尾忘返回 best
✓ 对:cur 累计、best 取最大、最后返回 best
cur 是临时的当前段,会被 0 清零;真正的答案在 best 里
完整代码(Python / C++ / Java)
Python
def findMaxConsecutiveOnes(nums):
best = cur = 0 # 历史最长 / 当前连续
for x in nums:
if x == 1: # 遇 1:这段加长
cur += 1
best = max(best, cur) # 顺手刷新最长
else: # 遇 0:这段断开
cur = 0
return bestC++
int findMaxConsecutiveOnes(vector<int>& nums){
int best = 0, cur = 0;
for (int x : nums) {
if (x == 1) { cur++; best = max(best, cur); }
else cur = 0;
}
return best;
}Java
public int findMaxConsecutiveOnes(int[] nums) {
int best = 0, cur = 0;
for (int x : nums) {
if (x == 1) { cur++; best = Math.max(best, cur); }
else cur = 0;
}
return best;
}复杂度
时间
O(n)
指针 i 把数组从头到尾扫一遍,每个元素只看一次
空间
O(1)
只用 cur 和 best 两个计数器,不开额外数组
看不够?换成动画再走一遍
上面的推演每一步都对应一帧动画。点开交互动画版,能一步步看着 最大连续 1 的个数 的数据怎么变、指针怎么走,还能切 Python / Java / C++ 跟着练。
面试官可能追问
cur 和 best 分别代表什么?+
cur 是「当前正连着的 1 有几个」,会在遇到 0 时归零;best 是「从头到现在见过的最长一段 1」,只增不减。答案是 best。
如果数组里全是 0,结果是多少?+
返回 0。cur 一直是 0,best 也一直是 0,没有任何一段连续的 1。
能不能不用额外变量、原地解?+
本题本来就只用两个 O(1) 计数器,已是最优;它和滑动窗口的区别在于窗口左边界不用回退,遇 0 直接清零即可。
想听吴师兄把这道题讲给你听?
文字版和动画都随便看。开通图解算法年卡,可以听吴师兄把 最大连续 1 的个数 一步步讲透(全站已上线 905 份讲透,持续扩充), 卡住的地方还有 AI 私教小欧就着动画帮你拆到懂。
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。