【滑动窗口】LeetCode 1004题解 | 最大连续1的个数 Ⅲ
最大连续1的个数 Ⅲ
- 一、题目链接
- 二、题目
- 三、题目解析
- 四、算法原理
- 解法一:暴力枚举 + zero计数器
- 解法二:滑动窗口
- 五、编写代码
- 六、时空复杂度
一、题目链接
最大连续1的个数 Ⅲ
二、题目
三、题目解析
注意题目中说的是最多k次,在一个数组翻转次数是可以 ≤ k的。
四、算法原理
因为翻转操作太复杂,无需翻转。所以可以把本题同等转化为:找0的个数不超过k的最长子数组。
解法一:暴力枚举 + zero计数器
暴力枚举出所有0的个数不超过k的子数组,并用变量zero记录0的个数,时刻更新最长长度。
模拟暴力解法的过程,进而发现优化的地方:
right所指为1,zero不统计,right++
right所指为0,zero+=1,right++
接下来left++,right回退,开始枚举以第二个数开始的符合要求的子数组。发现right停在了一样的位置,再分析发现在蓝色区间内开始枚举的话,right一定会在一样的位置停下,并且zero还会超过限定次数:
综上得出规律1:找到一个结果后,right不用回退,left跳过这一区间。 此时zero为2,right再接着向右枚举。规律2:left向右移动结束后,right继续向右移动。—— 同向双指针
解法二:滑动窗口
五、编写代码
class Solution {
public:int longestOnes(vector<int>& nums, int k) {int n = nums.size(), left = 0, right = 0, zero = 0, ret = 0;while (right < n){if (nums[right] == 0) zero++;// 进窗口while (zero > k) // 判断if (nums[left++] == 0) zero--;// 出窗口ret = max(ret, right - left + 1);// 更新结果right++;}return ret;}
};
六、时空复杂度
时间复杂度:O(n)
空间复杂度:O(1)