LeetCode题解—1004.最大连续1的个数III,滑动窗口简单模板

在题解里学习到了一个滑动窗口模板,十分有用。
在这个题目里,把问题抽象出来就是要找到一个最多含有K个0的最长子数组。
用left和right标记子数组的左端和右端。
既然子数组里最多K个0,那只要0的个数没有超过K个,子数组的长度就可以继续延伸,right++。
最重要的是当子数组里的0的个数超过了K个,left就向右移动,知道子数组里的0的个数不多于K个。
子数组的最大长度用right-left+1就可得出。

class Solution {
public:
    int longestOnes(vector<int>& A, int K) {
        if(K == A.size())
            return K;


        int len = A.size();
        int ans = 0;//最大长度
        int nums = 0;//0的个数
        int left = 0;
        int right = 0;
        //子数组内只允许最多有k个0,当子数组内0的个数超过K后,left向前找到第一个0再向前

        while(right <= len - 1){
            if(A[right] == 0){//遇到0就把nums++
                nums++;
            }


            while(nums > K && left < len){
                if(A[left] == 1){
                    left++;
                }else{
                    nums--;
                    left++;
                }
            }

            ans = max(ans, right - left + 1);
            right++;
        }

        //ans = right - left + 1;

        return ans;


    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值