题目描述
给定一个二进制数组,你可以最多将 1 个 0 翻转为 1,找出其中最大连续 1 的个数。
示例 1:
输入:[1,0,1,1,0]
输出:4
解释:翻转第一个 0 可以得到最长的连续 1。
当翻转以后,最大连续 1 的个数为 4。注:
输入数组只包含 0 和 1.
输入数组的长度为正整数,且不超过 10,000进阶:
如果输入的数字是作为 无限流 逐个输入如何处理?换句话说,内存不能存储下所有从流中输入的数字。您可以有效地解决吗?
算法分析
双指针
维护一个区间,这个区间中最多只包含一个0。当区间中包含两个0的时候,直接移动左边界
l
直到区间只包含一个0即可。这个过程中去更新最大区间长度
代码
class Solution {
public:
int findMaxConsecutiveOnes(vector<int>& nums) {
int left = 0;
int right = 0;
int count = 0;
int max_length = 0;
for(int right = 0; right < nums.size(); ++right) {
if(nums[right] == 0) {
++count;
while(count > 1) {
if(nums[left] == 0) {
--count;
}
++left;
}
}
max_length = std::max(max_length, right - left + 1);
}
return max_length;
}
};
时间复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)