leetcode--1004 最大连续1的个数 III[滑动窗口c++]
2023-12-13 18:51:37
原题链接:
题目解析:
题目的翻转0,意思就是把0变成1;
将题的 最多可翻转k个0 操作看成? ?限定范围内最多可有k个0(等价转换)
因为实际上,我们只要知道长度即可。注意,当这个子串含有的0的个数达到k个时,还能继续往后找,增加子串长度,只要没有遇到0就行,这点在设置判断条件时尤为重要。不理解可以接着往下看。
最大连续个数可以看成是最长子串问题,而最长子串问题可以用滑动窗口解决。
算法解析:
设置计数器,计算0的个数
首先数组不能越界,所以最外层循环进入条件为right<n(数组长度)
滑动窗口四步走:
1.进窗口---? 遇到0计数器++,否则忽略(?ps:滑动窗口的进窗口操作是载入数据,而不是单纯的移动right指针,如果只移动了right而没有对数据进行处理,则不算进窗口。)
2.判断? --- 0个数是否大于 题目中的k (不是等于而是大于,这是因为如果在计数器的0个数等于k时就停止进窗口,并更新状态,那么就会漏情况。比如k为2 那么数组 1? 1? 0? 0? 1? 1? 1 1 这个数组中最长子串的长度就是8,如果是在0等于2个时就停下,那么更新的结果就会是4? ?还是不理解可以自己提交示例运行试试)
3.出窗口---left移动,遇到0时计数器--,直到计数器的0个数等于k个,符合题目要求为止。(所以用while循环)
4.更新状态 --- 无论是否出窗口都更新状态。只要用个max函数来判断此时的子串是否是最大长度即可
代码
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
//翻转意思是把0改成1
int zero =0,ret = 0, left = 0,right =0,n = nums.size();
while( right < n)
{
//进窗口
if(nums[right] == 0)
{
zero++;
}
//判断zero是否大于k,因为如果是刚等于,如果后面还有1,就会导致漏情况eg2
while(zero > k)
{
//出窗口
if(nums[left++]== 0)
{
zero--;
}
}
//更新
ret = max(ret,right-left+1);
right++;
}
return ret;
}
};
文章来源:https://blog.csdn.net/lrsnt/article/details/134976776
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!