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

文章目录

    • 1. 题目描述
      • 1.1. Limit
      • 1.2. Problem Description
      • 1.3. Sample Input 1
      • 1.4. Sample Output 1
      • 1.5. Sample Input 2
      • 1.6. Sample Output 2
      • 1.7. Note
      • 1.8. Source
    • 2. 解读
    • 3. 代码

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;
    }
};

联系邮箱:[email protected]

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

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

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

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

LeetCode 1004 最大连续1的个数 III 滑动窗口、尺取法_第1张图片

你可能感兴趣的:(算法刷题笔记,#,滑动窗口,队列,算法,C++,LeetCode)