题目链接:1004. 最大连续 1 的个数 III
2. 题目描述:

3. 解法(滑动窗口):
算法思路:
不要去想怎么翻转,不要把问题想的很复杂,这道题的结果无非就是一段连续的 1 中间塞了 k
个 0 嘛。
因此,我们可以把问题转化成:求数组中一段最长的连续区间,要求这段区间内 0 的个数不超
过 k 个。
既然是连续区间,可以考虑使用「滑动窗口」来解决问题
算法流程:
a. 初始化一个大小为 2 的数组就可以当做哈希表 hash 了;初始化一些变量 left = 0 ,
right = 0 , ret = 0 ;
b. 当 right 小于数组大小的时候,一直下列循环:
i. 让当前元素进入窗口,顺便统计到哈希表中;
ii. 检查 0 的个数是否超标:
• 如果超标,依次让左侧元素滑出窗口,顺便更新哈希表的值,直到 0 的个数恢复正
常;
iii. 程序到这里,说明窗口内元素是符合要求的,更新结果;
iv. right++ ,处理下一个元素;
c. 循环结束后, ret 存的就是最终结果。
C++ 算法代码:
cpp
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); // 更新结果
}
return ret;
}
};
C++ 代码结果:

Java 算法代码:
java
class Solution
{
public int longestOnes(int[] nums, int k)
{
int ret = 0;
for(int left = 0, right = 0, zero = 0; right < nums.length; right++)
{
if(nums[right] == 0) zero++; // 进窗口
while(zero > k) // 判断
if(nums[left++] == 0) zero--; // 出窗口
ret = Math.max(ret, right - left + 1); // 更新结果
}
return ret;
}
}
Java 运行结果:
