leetcode--1004 最大连续1的个数 III[滑动窗口c++]

2023-12-13 18:51:37

原题链接:

3. 无重复字符的最长子串 - 力扣(LeetCode)

题目解析:

题目的翻转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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。