C++ 优先算法 —— 长度最小的子数组(滑动窗口)

目录

题目:长度最小的子数组 

1. 题目解析

2. 算法原理

Ⅰ. 暴力枚举

Ⅱ. 滑动窗口(同向双指针)

滑动窗口正确性

3. 代码实现

Ⅰ. 暴力枚举(会超时)

Ⅱ. 滑动窗口(同向双指针)


题目:长度最小的子数组 

1. 题目解析

题目截图:

 这里需要注意一些题目的细节问题,如下:

上面 [4,3] 这个子数组符合 ≥target 的条件且是最短的长度为 2,所以,结果输出为 2

若是数组中的其中一个值作为子数组就能满足 ≥target 的,最小长度的子数组长度必定是1。

若数组中所有的值相加都是 < target ,那么不存在符合条件的子数组(整个数组也算是数组的子数组),就返回0。

2. 算法原理

这道题有两种解法:

  • 暴力枚举
  • 滑动窗口(同向双指针)

Ⅰ. 暴力枚举

暴力枚举:这里就是枚举出所有的子数组之和,判断它是否满足要求。

这里还可以优化一下,优化成O(N²):

题目中,已经强调是一个正整数数组,数组里面的元素全都是 >0 的,在做加法的时候,加的数越多,和就越大(单调性)。

这样就可以省去再从前到后遍历一遍子数组了,这里还可以再优化一下: 

也就是sum符合结果时,再向后枚举都符合结果(正整数数组),但是len是递增的,不符合要求,后面不需考虑。

接着让 left 往后移动一位,让 right 回退到 left 的位置 ,继续枚举。

Ⅱ. 滑动窗口(同向双指针)

在暴力枚举最后的优化情况,还可以观察到一个优化的地方:

此时 right 就可以不动,没有必要再让 right 回退到 left 的位置遍历再计算这一小段的子数组的和了,只需要更新 sum 即可(让 sum 减去 left 上一次指向的元素)。

这样就可以用双指针来解决了,也就是:利用单调性,使用同向双指针(两个指针移动方向一致)来优化。

同向双指针也称作滑动窗口。

什么时候用滑动窗口呢?

也就是利用单调性的时候。当发现利用暴力解法的时候,两个指针都可以做到不回退,都向同一个方向移动的时候,此时就可以用滑动窗口(本质就是同向双指针)。

怎么用滑动窗口?

  1. 先初始化 left 和 right (左端点,右端点)                                                                                                left = 0 , right = 0 (用它俩分别标记窗口的左右区间)
  2. 进窗口
  3. 判断: 根据判断是否出窗口

(其中2、3步是循环的) 

进窗口,在这里就是right所指向的元素进入窗口,进入窗口之后,sum就要更新 。

 接着再让right往后移动即可,再接着判断:

再重复操作

 right再向后移动1位时:

此时,就可以更新以下结果了,这里结果就是len(子数组长度)。 

 更新完结果之后,再出窗口,这里就是让left向右移动一位,出窗口时候还需要把sum更新一下:

 出完窗口之后继续判断:

这时,又到了进窗口之后判断的操作了: 

注意:出完窗口时候还要继续判断, 因为可能依旧是大于等于target,若满足,还需要更新结果再出窗口:

此时,又观察到,sum<target,不满足要求,继续进窗口:

判断,又满足了要求,再接着出窗口(重复上面的操作):

判断,又得出sum>target,继续出窗口:

判断,不满足要求 ,继续让right向后移动(进窗口):

但此时可以观察到,没有下一个元素了,这时让right指向的下一个元素就已经越界了,这时窗口就结束了。此时这个 len 就是最终结果。

所以,大方向分为三步:1. 进窗口  。2. 判断。3. 出窗口。

这里更新结果需要看题目要求:有的需要进窗口时更新,有的需要出窗口时更新,有的会在出窗口之后再更新。

滑动窗口正确性

虽然并没有把所有的情况都给枚举出来,但是已经直到接下来的情况是没有必要的行为,因此是利用单调性,规避了很多没有必要的枚举行为。 

这里时间复杂度:根据实际情况是每一步操作仅仅会让 right 向右移动 1 位或 left 向右移动 1 位,直到 right 移动到最后的位置。这里最差的情况下,也就是 n+n  ->  2n 次,所以就是 O(N)。 

3. 代码实现

题目链接:长度最小的子数组

Ⅰ. 暴力枚举(会超时)

//代码实现
//时间复杂度:O(N²)
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n = nums.size();int len = INT_MAX;for(int left = 0; left < n; left++){int sum = 0;for (int right = left; right < n; right++){sum += nums[right];if(sum >= target){len = min(len,right-left+1);break;}}}return len==INT_MAX?0:len;}
};

提交记录:(会超时)

Ⅱ. 滑动窗口(同向双指针)

//代码实现
//注意这里虽然有两个循环,但是要根据实际情况
//时间复杂度:O(N)
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n=nums.size(), sum=0,len=INT_MAX;//sum标记维护窗口的和,len标记最终结果for(int left = 0, right = 0; right < n; right++){sum += nums[right];      //进窗口while(sum >= target)     //判断是否要出窗口,用while循环确保连续出窗口的情况{len = min(len, right - left + 1);    //更新结果sum -= nums[left++];                 //出窗口}}return len == INT_MAX ? 0 : len;}
};

提交记录:

制作不易,若有不足之处或出问题的地方,请各位大佬多多指教 ,感谢大家的阅读支持!!!    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp定义new plus.nativeObj.View实现APP端全局弹窗

为什么要用new plus.nativeObj.View在APP端实现弹窗&#xff1f;因为uni.showModal在APP端太难看了。 AppPopupView弹窗函数参数定义 参数一:弹窗信息(所有属性可不填&#xff0c;会有默认值) 1.title:"", //标题 2.content:"", //内容 3.confirmBoxCo…

互联网摸鱼日报(2024-11-22)

互联网摸鱼日报(2024-11-22) 36氪新闻 学习马斯克不丢人&#xff0c;脸书也开始改造自己了 旅游行业趋势变了&#xff0c;增长还能从哪里寻找&#xff1f; 大厂入局后&#xff0c;小型小游戏团队能否继续喝一口汤&#xff1f; 一拥而上的“跨界咖啡”&#xff0c;是“走心”…

网络安全——SpringBoot配置文件明文加密

一、前言 在日常开发中&#xff0c;项目中会有很多配置文件。比如SpringBoot项目核心的数据库配置、Redis账号密码配置都在properties、yml配置文件 中。 如果这些信息以明文的方式存储&#xff0c;你的电脑被拿去修理&#xff0c;就会容易泄露&#xff0c;一旦被其他人获取到…

Linux系统编程之进程基础知识

概述 在Linux系统中&#xff0c;进程是指一个正在运行的程序实例。每个进程都有一个唯一的进程标识符&#xff0c;即PID&#xff0c;操作系统通过这个PID来唯一识别和管理各个进程。进程不仅仅是程序代码的运行实例&#xff0c;它还包含了程序运行时所需的各种资源&#xff0c;…

docker离线安装linux部分问题整理

0:离线安装docker过程命令 echo $PATH tar -zxvf docker-26.1.4.tgz chmod 755 -R docker cp docker/* /usr/bin/ root 权限 vim /etc/systemd/system/docker.service --------- [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.do…

2024智能机器人与自动控制国际学术会议 (IRAC 2024)

主办&#xff0c;承办&#xff0c;支持单位 会议官网 www.icirac.org 大会时间&#xff1a;2024年11月29-12月1日 大会简介 2024智能机器人与自动控制国际学术会议 &#xff08;IRAC 2024&#xff09;由华南理工大学主办&#xff0c;会议将于2024年11月29日-12月1日在中国广…

【Pytest+Yaml+Allure】实现接口自动化测试框架

一、框架思想 requestsyamlpytestallure实现接口自动化框架。结合数据驱动和分层思想&#xff0c;将代码与数据分离&#xff0c;易维护&#xff0c;易上手。使用yaml编写编写测试用例&#xff0c;利用requests库发送请求&#xff0c;使用pytest管理用例&#xff0c;allure生成…

利用 Jsoup 进行高效 Web 抓取与 HTML 处理

Jsoup 是一款 Java 的 HTML 解析器&#xff0c;可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API&#xff0c;可通过 DOM&#xff0c;CSS 以及类似于 JQuery 的操作方法来取出和操作数据。 官网&#xff1a;https://jsoup.org/ 中文文档&#xff1a;Jsou…

蓝桥杯不知道叫什么题目

小蓝有一个整数&#xff0c;初始值为1&#xff0c;他可以花费一些代价对这个整数进行变换。 小蓝可以花贵1的代价将教数增加1。 小蓝可以花费3的代价将整数增加一个值,这个值是整数的数位中最大的那个(1到9) .小蓝可以花费10的代价将整数变为原来的2倍, 例如&#xff0c;如果整…

【JavaEE初阶】枫叶经霜艳,梅花透雪香-计算机是如何运行的?

本篇博客给大家带来的是与计算机相关的知识点, 包括:计算机的组成, 指令, 进程(重点). 文章专栏: JavaEE初阶 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 1. 计算机的组成 1.1 计算机的发展史 计算…

SuperMap Objects组件式GIS开发技术浅析

引言 随着GIS应用领域的扩展&#xff0c;GIS开发工作日显重要。一般地&#xff0c;从平台和模式上划分&#xff0c;GIS二次开发主要有三种实现方式&#xff1a;独立开发、单纯二次开发和集成二次开发。上述的GIS应用开发方式各有利弊&#xff0c;其中集成二次开发既可以充分利…

Linux网络——NAT/代理服务器

一.NAT技术 1.NAT IP转换 之前我们讨论了, IPv4 协议中, IP 地址数量不充足的问题&#xff0c;NAT 技术就是当前解决 IP 地址不够用的主要手段, 是路由器的一个重要功能。 NAT 能够将私有 IP 对外通信时转为全局 IP. 也就是一种将私有 IP 和全局IP 相互转化的技术方法: 很…

前端安全和解决方案

提到这个我可能想到的就是不要暴露太多的账号密码信息。一些页面的请求和操作要加上权限。 然后下面就详细的介绍前端可能遇到的安全问题以及解决方法。 首先比较常见的前端的安全性问题就是跨站脚本攻击&#xff08;XSS&#xff09;。跨站请求伪造&#xff08;csrf&#xff…

使用八爪鱼爬虫抓取汽车网站数据,分析舆情数据

我是做汽车行业的&#xff0c;可以用八爪鱼爬虫抓取汽车之家和微博上的汽车文章内容&#xff0c;分析各种电动汽车口碑数据。 之前&#xff0c;我写过很多Python网络爬虫的案例&#xff0c;使用requests、selenium等技术采集数据&#xff0c;这次尝试去采集小米SU7在微博、汽车…

C语言笔记(自定义类型:结构体、枚举、联合体 )

前言 本文对自定义类型的结构体创建、使用、结构体的存储方式和对齐方式&#xff0c;枚举的定义、使用方式以及联合体的定义、使用和存储方式展开叙述&#xff0c;如有错误&#xff0c;请各位指正。 目录 前言 1 结构体 1.1 结构体的声明 1.2 结构体的自引用 1.3 结构体变…

网络安全问题与大忌

“老三样&#xff0c;堵漏洞、做高墙、防外攻&#xff0c;防不胜防。” 日前&#xff0c;中国工程院沈昌祥院士这样概括中国信息安全的基本状况。 信息安全提了这么些年&#xff0c;究竟国内的网络如何脆弱&#xff0c;如何不堪一击&#xff0c;恐怕常人是难以想象的。公安部计…

3.langchain中的prompt模板 (few shot examples in chat models)

本教程将介绍如何使用LangChain库和智谱清言的 GLM-4-Plus 模型来理解和推理一个自定义的运算符&#xff08;例如使用鹦鹉表情符号&#x1f99c;&#xff09;。我们将通过一系列示例来训练模型&#xff0c;使其能够理解和推断该运算符的含义。 环境准备 首先&#xff0c;确保…

【消息序列】详解(6):深入探讨缓冲区管理与流量控制机制

目录 一、概述 1.1. 缓冲区管理的重要性 1.2. 实现方式 1.2.1. HCI_Read_Buffer_Size 命令 1.2.2. HCI_Number_Of_Completed_Packets 事件 1.2.3. HCI_Set_Controller_To_Host_Flow_Control 命令 1.2.4. HCI_Host_Buffer_Size 命令 1.2.5. HCI_Host_Number_Of_Complete…

如何使用OCR技术批量识别图片中的文字并重命名文件,OCR 技术批量识别图片中的文字可能出现的错误

字符识别错误 形近字混淆&#xff1a;例如 “已” 和 “己”、“未” 和 “末” 等&#xff0c;由于外形极为相似&#xff0c;OCR 软件在识别时可能出现误判&#xff0c;将原本正确的字识别成与之形近的另一个字。比如在识别一篇手写的文章中&#xff0c;手写体的 “已” 可能就…

Qt | 开发技能提升档次哈

点击上方"蓝字"关注我们 01、Creator常用快捷键 >>> F1 查看帮助 F2 跳转到函数定义 Shift+F2 声明和定义之间切换 F3 查找下一个 F4 头文件和源文件之间切换 Ctrl+1 欢迎模式 Ctrl+2 编辑模…