LeetCode 1004 最大连续1的个数 III 滑动窗口、尺取法

1. 题目描述

1.1. Limit

Time Limit: 2000 ms

Memory Limit: 131072 kB

1.2. Problem Description

给定一个由若干 01 组成的数组 A,我们最多可以将 K 个值从 0 变成 1

返回仅包含 1 的最长(连续)子数组的长度。

1.3. Sample Input 1

输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2

1.4. Sample Output 1

输出:6
解释:
[1,1,1,0,0,1,1,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 6

1.5. Sample Input 2

输入:A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3

1.6. Sample Output 2

输出:10
解释:
[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 10

1.7. Note

1 <= A.length <= 20000

0 <= K <= A.length

A[i] 为 0 或 1

1.8. Source

LeetCode 1004 最大连续1的个数 III

2. 解读

滑动窗口、尺取法。统计窗口内0的数量是否大于K,大于K则减小窗口大小。

3. 代码

class Solution {
public:
    int longestOnes(vector<int>& A, int K)
    {
        queue<int> qu;
        int count = 0;
        size_t ans = 0;
        size_t len = A.size();
        // 尺取
        for (size_t i = 0; i < len; i++) {
            // 放入队列
            qu.push(A[i]);
            // 记录队列中0的数量
            if (A[i] == 0)
                count++;
            // 当0的数量大于K时,出队
            while (count > K) {
                if (qu.front() == 0)
                    count--;
                qu.pop();
            }
            // 记录队列最大长度
            ans = max(ans, qu.size());
        }
        return ans;
    }
};

联系邮箱:curren_wong@163.com

CSDN:https://me.csdn.net/qq_41729780

知乎:https://zhuanlan.zhihu.com/c_1225417532351741952

公众号:复杂网络与机器学习

欢迎关注/转载,有问题欢迎通过邮箱交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值