力扣-485. 最大连续 1 的个数
1.题目介绍
题目地址(485. 最大连续 1 的个数 - 力扣(LeetCode))
https://leetcode.cn/problems/max-consecutive-ones/
题目描述
给定一个二进制数组 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 <= 105
nums[i]
不是0
就是1
.
2.题解
2.1 暴力枚举
思路
遍历数组,找到连续次数最多的组合
代码
- 语言支持:C++
C++ Code:
class Solution {
public:
int findMaxConsecutiveOnes(vector<int>& nums) {
int ans = 0, temp = 0;
for(int i = 0; i < nums.size(); i++){
if(nums[i] == 1){
temp++;
}else{
ans = max(ans, temp);
temp = 0;
}
}
ans = max(ans, temp);
return ans;
}
};
复杂度分析
令 n 为数组长度。
- 时间复杂度:
- 空间复杂度:
2.2 一维前缀和
思路
记录前缀和,最大的前缀和即为1出现的最大次数
代码
class Solution {
public:
int findMaxConsecutiveOnes(vector<int>& nums) {
int n = nums.size();
vector<int> prev(n);
for(int i = 0; i < n; i++){
if(nums[i] == 0) continue;
if(i == 0) prev[i] = nums[i];
else prev[i] = prev[i-1] + nums[i];
}
return *max_element(prev.begin(),prev.end());
}
};
2.3 滑动窗口
思路
维护一个prev和cur, 如果是1,向右扩展窗口; 如果为0, prev=cur,向后直到再次找到一个1
最后的判断if(cur != n || (cur == n && nums[cur-1] != 0))
是防止最后寻找到的都是0,while循环由于cur<n停止而不是由于nums[cur] != 1停止
比如像一个[0], 本来不应该计算长度,但是这里由于cur==n导致while循环停止,计算了maxLen = max(maxLen, cur - prev + 1) = 1 !!!!!
class Solution {
public:
int findMaxConsecutiveOnes(vector<int>& nums) {
int n = nums.size();
int prev = 0, maxLen = 0;
for(int cur = 0; cur < n; cur++){
if(nums[cur] != 1){
prev = cur;
while(cur < n && nums[cur] != 1){
cur++;
prev++;
}
}
if(cur != n || (cur == n && nums[cur-1] != 0))
maxLen = max(maxLen, cur - prev + 1);
}
return maxLen;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了