1. 题⽬链接: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++算法代码:
class Solution
{
public:
int longestOnes(vector<int>& nums, int k)
{
int left=0,right=0,count=0;
int _max=0;
for(;right<nums.size();right++)
{
if(nums[right]==0)
{
count++;
}
while(count>k)
{
_max=max(_max,right-left);
if(nums[left]==0)
{
count--;
}
left++;
}
}
_max=max(_max,right-left);
return _max;
}
};
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;
}
}