LeetCode 485. Max Consecutive Ones
题目描述
给定一个二进制数组 nums,计算其中最大连续 1 的个数。
示例 1:
1 | 输入:nums = [1,1,0,1,1,1] |
示例 2:
1 | 输入:nums = [1,0,1,1,0,1] |
解题思路
本题要求找出二进制数组中最长的一段连续 1 的长度。核心思想是遍历数组并维护两个变量:当前连续 1 的长度(pre_sum)和全局最大连续 1 的长度(max_sum)。
算法分析步骤:
- 初始化
pre_sum = 0(当前连续 1 的长度)和max_sum = 0(全局最大值)。 - 遍历数组中的每个元素
nums[i]:- 尝试将当前元素累加到
pre_sum上,计算结果res = pre_sum + nums[i]。 - 关键判断: 如果
res == pre_sum,说明nums[i] == 0(累加后值不变,即遇到0)。此时:- 用当前的
pre_sum(即上一个连续 1 段的长度)更新max_sum。 - 将
pre_sum重置为0,开始下一段计数。
- 用当前的
- 否则(
res > pre_sum),说明nums[i] == 1:- 将
pre_sum加1,继续累加当前连续 1 的长度。
- 将
- 尝试将当前元素累加到
- 遍历结束后,最后一段连续
1的长度可能还未与max_sum比较(如果数组以1结尾),因此返回max(max_sum, pre_sum)。
为什么这个判断方式有效? 因为二进制数组中元素只有 0 和 1。pre_sum + 1 > pre_sum(遇到 1),而 pre_sum + 0 == pre_sum(遇到 0)。利用累加后是否变化来区分遇 0 和遇 1,同时用 pre_sum 记录当前连续 1 的计数。遇到 0 时结算一段,重置计数器;遇到 1 时继续累加。
复杂度分析
- 时间复杂度:
O(n),其中n为数组长度。只需要一次遍历即可完成计算。 - 空间复杂度:
O(1),只使用了常数个额外变量(pre_sum、max_sum、res),不随输入规模增长。
代码
1 | from typing import List |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 𝒞𝒶𝓃𝒶𝓇𝓎!