专题二 - 滑动窗口 - leetcode 1004. 最大连续1的个数 III | 中等难度

leetcode 1004. 最大连续1的个数 III

  • leetcode 1004. 最大连续1的个数 III | 中等难度
    • 1. 题目详情
      • 1. 原题链接
      • 2. 基础框架
    • 2. 解题思路
      • 1. 题目分析
      • 2. 算法原理
      • 3. 时间复杂度
    • 3. 代码实现
    • 4. 知识与收获

在这里插入图片描述

leetcode 1004. 最大连续1的个数 III | 中等难度

1. 题目详情

给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 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。

示例 2:
输入:nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
输出:10
解释:[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 10。

提示:
1 <= nums.length <= 105
nums[i] 不是 0 就是 1
0 <= k <= nums.length

1. 原题链接

leetcode 1004. 最大连续1的个数 III

2. 基础框架

● Cpp代码框架

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {

    }
};

2. 解题思路

1. 题目分析

( 1 ) (1) (1) 本题给出二进制数组nums(只包含0/1),允许最多翻转k个0,找出最长连续且全1的子数组。

( 2 ) (2) (2) 首先如果什么都不想,直接按照题意进行翻转0操作并枚举全1连续子数组,翻转完一个位置的0后还要还原回去,总的来说这是一件非常麻烦的事。

( 3 ) (3) (3) 对于暴力枚举,我们也不是直接翻转0再枚举的;而是模拟(计数)翻转,定义一个0计数器zeroCnt,记录已翻转0的次数(即遇到0不翻转而是计数器zeroCnt自增1表示进行了翻转)。

这时进行暴力枚举操作就十分容易了:
定位起始位置left,枚举以left为起始位置,right为结束位置的所有满足题意的子数组。

如果right位置的新元素是1,则满足题意,right++
如果right位置的新元素是0,0计数器自增1(zeroCnt++),之后分两种情况:
————1. 如果zeroCnt<= k,说明此时可以把0当做1使用,满足题意,right++
————2. 如果zeroCnt > k,说明此时不可以把0当做1使用,即不满足题意,以left为起始位置的最长连续全1子数组只能到right-1位置,right及其之后的位置上的元素都不符合题意,此时就可以枚举以left+1为起始位置的所有子数组了。

2. 算法原理

( 1 ) (1) (1) 滑动窗口:对暴力枚举思路的优化

( 2 ) (2) (2) 通过对上述暴力枚举的分析,以left为起始位置,right为结束位置的枚举过程,每次不满足题意时,left都右移1位,right回退到left位置继续枚举子数组。

( 3 ) (3) (3) 这其中right回退的操作,导致了重复的枚举操作:
在上一次枚举过程的最后一次结果中,满足题意的范围是[left, right-1],所以本次right指针回退并继续从left+1开始枚举操作,那么[left+1, right-1]已经有效范围会被right指针重新枚举。

( 4 ) (4) (4) 优化:很明显[left+1,right-1]是符合题意的子数组,所以对于right不必回退,只需要left右移,直到zeroCnt<=k即[left, right]是连续全1子数组)即可。
在这里插入图片描述

( 5 ) (5) (5) 思路:

  1. 初始化left=0,right=0,maxlen=0
  2. 进窗口:如果nums[right]是0,则zeroCnt++;否则什么也不做
  3. 循环判断:如果zeroCnt>k,即不满足题意:
  4. 出窗口:left右移,直到0计数器不大于k
  5. 更新结果:maxlen = max(maxlen, right-left+1)

3. 时间复杂度

暴力枚举 O ( n 2 ) O(n^2) O(n2)

滑动窗口 O ( n ) O(n) O(n)

leftright同向移动,直到末尾,即遍历一遍数组nums

3. 代码实现

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int maxlen = 0;
        int zeroCnt = 0;
        int l = 0, r = 0;
        int n = nums.size();
        while(r < n){
            if(nums[r] == 0) zeroCnt++;//进窗口
            while(zeroCnt > k){//判断
                if(nums[l++] == 0) zeroCnt--;//"滚出"窗口
            }
            maxlen = max(maxlen, r - l + 1);//更新结果
            r++;//下一次进窗口做准备
        }
        return ret;
    }
};

4. 知识与收获

( 1 ) (1) (1) 翻转0操作按照题意直接写会非常麻烦,所以设置了0计数器来记录翻转0的数量,而不是真正的翻转操作,这是第一步优化的方法,为滑动窗口算法的介绍铺路。


T h e The The E n d End End

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/447581.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux之线程控制

目录 一、POSIX线程库 二、线程的创建 三、线程等待 四、线程终止 五、分离线程 六、线程ID&#xff1a;pthread_t 1、获取线程ID 2、pthread_t 七、线程局部存储&#xff1a;__thread 一、POSIX线程库 由于Linux下的线程并没有独立特有的结构&#xff0c;所以Linux并…

蓝牙系列十一:HCI层的数据格式

HCI层作为Host和Controlor链接的接口存在。以下是对HCI层的数据格式的解析。 1、参考&#xff1a;蓝牙协议core_v5.0.pdf 《Vol 2: Core System Package [BR/EDR Controller volume]》的“Part E: Host Controller Interface Functional Specification” 2. 协议栈框图 对于被…

Linux:kubernetes(k8s)pod的基础操作(6)

Linux&#xff1a;kubernetes&#xff08;k8s&#xff09;允许在任意节点使用kubectl命令&#xff08;5&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/136460090?spm1001.2014.3001.5501 我在前两张进行了基础环境的一系列搭建&#xff0c;现在就正…

NIFI从Oracle11G同步数据到Mysql_亲测可用_解决数据重复_数据跟源表不一致的问题---大数据之Nifi工作笔记0065

首先来看一下整体的流程: 可以看到了用到了上面的这些处理器,然后我们主要看看,这里之前 同步的时候,总是出现重复的数据,奇怪. 比如源表中只有166条数据,但是同步过去以后变成了11万条数据了. ${db.table.name:equals(table1):or(${db.table.name:equals(table2)})} 可以看…

职场成功的关键:积极主动,勇于担当

在职场中&#xff0c;每个人都渴望成功。然而&#xff0c;成功并非一蹴而就&#xff0c;而是需要我们在日常工作中不断积累、锻炼和提升。本文将为您揭示职场成功的关键因素&#xff0c;帮助您在职场道路上越走越远。 一、积极主动&#xff0c;主动承担责任 在职场中&#xff0…

吴恩达机器学习笔记十六 如何debug一个学习算法 模型评估 模型选择和训练 交叉验证测试集

如果算法预测出的结果不太好&#xff0c;可以考虑以下几个方面&#xff1a; 获得更多的训练样本 采用更少的特征 尝试获取更多的特征 增加多项式特征 增大或减小 λ 模型评估(evaluate model) 例如房价预测&#xff0c;用五个数据训练出的模型能很好的拟合这几个数据&am…

RocketMQ入门指南:从零开始学习分布式消息队列技术

RocketMQ 1. MQ介绍1.1 为什么要用MQ1.2 MQ的优点和缺点1.3 各种MQ产品的比较 2. RocketMQ快速入门2.1 准备工作2.1.1 下载RocketMQ2.2.2 环境要求 2.2 安装RocketMQ2.2.1 安装步骤2.2.2 目录介绍 2.3 启动RocketMQ2.4 测试RocketMQ2.4.1 发送消息2.4.2 接收消息 2.5 关闭Rocke…

【Python】科研代码学习:七 TrainingArguments,Trainer

【Python】科研代码学习&#xff1a;七 TrainingArguments&#xff0c;Trainer TrainingArguments重要的方法 Trainer重要的方法使用 Trainer 的简单例子 TrainingArguments HF官网API&#xff1a;Training 众所周知&#xff0c;推理是一个大头&#xff0c;训练是另一个大头 之…

【PyTorch实战演练】深入剖析MTCNN(多任务级联卷积神经网络)并使用30行代码实现人脸识别

文章目录 0. 前言1. 级联神经网络介绍2. MTCNN介绍2.1 MTCNN提出背景2.2 MTCNN结构 3. MTCNN PyTorch实战3.1 facenet_pytorch库中的MTCNN3.2 识别图像数据3.3 人脸识别3.4 关键点定位 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff…

【Qt学习笔记】(二)--第一个程序“Hello World”(学习Qt中程序的运行、发布、编译过程)

声明&#xff1a;本人水平有限&#xff0c;博客可能存在部分错误的地方&#xff0c;请广大读者谅解并向本人反馈错误。    因为我个人对Qt也是有一些需求&#xff0c;所以开设本专栏进行学习&#xff0c;希望大家可以一起学习&#xff0c;共同进步。   这篇博客将从一个 He…

算法刷题Day1 | 704.二分查找、27.移除元素

目录 0 引言1 二分查找1.1 我的解题1.2 修改后1.3 总结 2 移除元素2.1 暴力求解2.2 双指针法&#xff08;快慢指针&#xff09; &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1f4a5; 标题&#xff1a;代码随想录算法训练营第一天…

Vue.js+SpringBoot开发大病保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统配置维护2.2 系统参保管理2.3 大病保险管理2.4 大病登记管理2.5 保险审核管理 三、系统详细设计3.1 系统整体配置功能设计3.2 大病人员模块设计3.3 大病保险模块设计3.4 大病登记模块设计3.5 保险审核模块设计 四、…

MySQL三种日志

一、undo log&#xff08;回滚日志&#xff09; 1.作用&#xff1a; &#xff08;1&#xff09;保证了事物的原子性 &#xff08;2&#xff09;通过read view和undo log实现mvcc多版本并发控制 2.在事务提交前&#xff0c;记录更新前的数据到undo log里&#xff0c;回滚的时候读…

数据可视化助力林业智能管理

数据可视化是当下科技发展中的一项重要工具&#xff0c;它在各行各业都展现了强大的应用价值。在智慧林业领域&#xff0c;数据可视化更是发挥了独特的作用&#xff0c;为林业管理和生态保护提供了有效的支持和解决方案。下面我就以可视化从业者的角度&#xff0c;来简单聊聊这…

四节点/八节点四边形单元悬臂梁Matlab有限元编程 | 平面单元 | Matlab源码 | 理论文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

关于yolov8的DFL模块(pytorch以及tensorrt)

先看代码 class DFL(nn.Module):"""Integral module of Distribution Focal Loss (DFL).Proposed in Generalized Focal Loss https://ieeexplore.ieee.org/document/9792391"""def __init__(self, c116):"""Initialize a convo…

嵌入式C语言(六)

对齐这个事情在内核中可不是个什么小事&#xff0c;内核中涉及到内存方面的都需要非常的谨慎。 上一篇我们知道了可以通过__attribute__来声明属性&#xff0c;也知道了section这个属性&#xff0c;这篇我们来看看关于内存对齐使用的两个属性–>aligned和packed 地址对齐&…

Altium Designer如何对走线模式进行切换

AD软件提供了比较智能的走线模式切换功能&#xff0c;可以根据个人习惯进行切换&#xff0c;能有效的提高了PCB设计效率。 点击界面右上角系统参数的图标 或者在pcb界面中使用快捷键OP进入到优选项界面&#xff0c;然后选中 PCB Editor-Interactive Routing&#xff0c;在布线…

ubuntu設定QGC獲取pixhawk Mini4(PX4 Mini 4) 的imu信息

ubuntu20.04 QGC使用v4.3.0的版本 飛控pixhawk Mini4 飛控上只使用一條micro USB連接電腦&#xff0c;沒有其他線 安裝命令 sudo apt-get remove modemmanager -y sudo apt install gstreamer1.0-plugins-bad gstreamer1.0-libav gstreamer1.0-gl -y sudo apt install libf…

Vue:纯前端实现文件拖拽上传

先看一下拖拽相关的事件&#xff1a;dragover、dragenter drop和dragleave 。 dragover事件&#xff1a;当被拖动的元素在一个可放置目标上方时&#xff0c;该事件会被触发。 通常&#xff0c;我们会使用event.preventDefault()方法来取消浏览器默认的拖放行为&#xff0c;以便…