(3)滑动窗口算法练习:最长连续1的个数Ⅲ

最长连续1的个数Ⅲ

题目链接:1004. 最大连续1的个数 III - 力扣(LeetCode)

给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k0 ,则返回 数组中连续 1 的最大个数

示例 1:

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

输出:6

解释:1,1,1,0,0,**1** ,1,1,1,1,**1** 粗体数字从 0 翻转到 1,最长的子数组长度为 6。

思路解析:

题目说明最多翻转k个0,代表翻转0的个数可以有0, k个,所以有两种情况:

  1. 翻转个数在区间0, k

  2. 翻转个数大于k个时只能翻转k

所以,本题可以将原有问题转化为数组中0的个数不超过k个时,数组中连续1的最大个数

本题的暴力解法为:枚举子数组+记录0的个数,在暴力解法的基础上,对暴力解法进行优化,在枚举的过程中,定义两个指针leftright,均从起始位置开始向右移动,当right位置对应值为0时,计数器zero加1,代表0出现1次,便于后面与k进行比较判断,当zero>k时,说明此时[left, right]区间为满足要求的区间,接着移动left

以示例数组为例

正向性:当zero>k时,此时表示0的个数已经到达k个,接下来需要枚举下一个区间,那么left就需要向后移动,此时的right不需要向后移动,因为在区间(left=0)[left, right]中,0的个数已经到达k个,如果right再回到left=1的位置时,此时的区间(left=1)[left, right]中依旧包括刚才已经出现的k个0,导致计数器依旧会在同样的位置达到zero>k,所以只需要让right开始位置不需要回退,满足正向性

对于left指针的移动,为了确保区间[left, right]中不包括已经判断过的区间,可以让left移动到上一次满足条件的区间的最后一个元素的位置,[left, right]区间就避开了包含上一次满足条件的区间,而对于zero计数器来说,因为left回到了上一个合法区间的最后一个元素的位置,如果该位置的数值为0,则zero计数器需要减1,代表这个位置已经翻转过一次,还有k-1可以翻转,否则不处理

因为满足正向性,所以可以使用滑动窗口算法

  1. 进窗口:因为是统计0的个数,所以当right位置的值为0时,zero计数器加1,否则不处理

  2. 判断:当zero>k时,此时代表合法区间已经出现,因为k到达上限,所以不可以继续向后移动

  3. 出窗口:left移动到上一个合法区间的最后一个元素的位置,如果为0,则计数器减1

  4. 更新结果:用len存储最长的子数组

参考代码:

cpp 复制代码
class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int len = 0;
        int zero = 0;
        for (int right = 0, left = 0; right < nums.size(); right++) {
            if (nums[right] == 0) {
                zero++;
            }
            while (zero > k) {
                if (nums[left++] == 0) {
                    zero--;
                }
            }
            len = max(len, right - left + 1);
        }

        return len;
    }
};
相关推荐
乐观勇敢坚强的老彭11 小时前
C++信奥GESP四级的常见题型和解题模板速查表
开发语言·c++
欧特克_Glodon11 小时前
OpenCV计算机视觉开发入门与实践<二十二>:图像平滑之线性滤波
c++·人工智能·opencv·计算机视觉
沙盘客11 小时前
AFSIM 示例解读(09)· 传感器全家桶 sensor_demos(下):ESM / SAR / 被动测向
c++·经验分享·后端
大鹏的NLP博客11 小时前
WSL2 资源治理:从 ONNX Runtime CUDA 编译 OOM 到 `.wslconfig` 防御配置
c++·深度学习·onnx runtime
星星.72212 小时前
C++算法竞赛|二分查找与二分答案:边界模板、浮点二分、STL
数据结构·c++·算法
sel_912 小时前
【OPD论文导读(二)】OPD(On-Policy Distillation)全景调研:十篇论文讲透“在自己生成的内容上学习“这件事
人工智能·python·深度学习·学习·算法·语言模型
动词ing12 小时前
【学习笔记】数据结构(数组长度和关键特性+快慢指针+左右指针)
数据结构·笔记·学习
老当益壮梁奶奶12 小时前
Linux 软件编程学习笔记(六):线程编程入门与实践
linux·c语言·c++·笔记·学习
小小龙学IT12 小时前
Dear ImGui 开源即时模式 GUI 库深度解析
c++·ui·开源
金幄科技13 小时前
RAG第四篇:重排序 Rerank——粗召回之后,为什么还需要一次精排
人工智能·算法·ai·ai编程