011 最大连续 1 的个数 III
力扣链接:1004. 最大连续 1 的个数 III
1.1 题目详解
1.2 算法原理以及代码实现
1.2.1 解法思路:滑动窗口
不要去想怎么翻转,不要把问题想的很复杂,这道题的结果无非就是一段连续的 1 中间塞了 k 个 0。 因此,我们可以把问题转化成:求数组中一段最长的连续区间,要求这段区间内的 0 个数不超过 k 个。 既然是连续区间,可以考虑使用「滑动窗口」来解决问题。
1.2.2 算法流程
- 初始化一些变量 left = 0,right = 0,ret = 0;
- 当 right 小于数组大小的时候,一直下列循环——
(1)让当前元素进入窗口,顺便统计到哈希表中;
(2)检查 0 的个数是否超标:
1)如果超标,依次让左侧元素滑出窗口,顺便更新哈希表的值,直到 0 的个数恢复正常; (3)程序到这里,说明窗口内元素是符合要求的,更新结果; (4)right++,处理下一个元素;
- 循环结束后,ret 存的就是最终结果。
1.2.3 代码实现
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
int ret = 0;
for (int left = 0, right = 0, zero = 0; right < nums.size(); right++) {
// 进窗口
if (nums[right] == 0) zero++;
// 判断
while (zero > k)
if (nums[left++] == 0) zero--;
// 出窗口
// 更新结果
ret = max(ret, right - left + 1);
}
ret;
}
};


