专题二 -滑动窗口 - leetcode 209. 长度最小的子数组 | 中等难度

leetcode 209. 长度最小的子数组

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

在这里插入图片描述

leetcode 209. 长度最小的子数组 | 中等难度

1. 题目详情

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其总和大于等于 target 的长度最小连续子数组[numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

示例 2:
输入:target = 4, nums = [1,4,4]
输出:1

示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

提示:
1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 105

进阶:
如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。

1. 原题链接

leetcode 209. 长度最小的子数组

2. 基础框架

● Cpp代码框架

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {}
};

2. 解题思路

1. 题目分析

( 1 ) (1) (1) 本题数组nums都是正整数target也是正整数。要求找出其中大于等于target的最短连续子数组(序列)。

( 2 ) (2) (2) 暴力遍历算法是我们首先想到的方法,枚举出所有的可能情况,找出符合题目的结果。时间复杂度 O ( n 2 ) O(n^2) O(n2)

3 ) 3) 3 在暴力遍历时先定位一个位置left,从这个位置left开始,向右依次遍历所有元素。
假设在某个位置j满足了连续子数组大于等于target的条件,那么right之后的所有位置都没有必要再遍历了,因为数组的元素全是正整数,连续子数组的和sum一定是增大的,但是连续子数组的长度len也增大了,而题目中是要找最短的。所以i位置相当于已经判断完毕,可以直接判断以left+1位置为起始的连续子数组的是否满足题意了。

4 ) 4) 4 优化之法就在隐藏在暴力解法之内:无需重新从left+1位置开始遍历,直至right计算连续子数组的和,而是sum减去left位置的元素就得到了从left+1right的连续子数组的和。
这里面隐藏的规律是:

  1. 单调性:从left开始的连续子数组的和sum一定是增大的,长度len一定是增大的;
  2. leftright指针(或者说是下标)移动的方向是同向的,且不会回退到已经移动的位置。
    而上述所说的优化,即同向双指针,又形象的称为滑动窗口。指针leftright分别相当于滑动窗口的左边界和右边界,滑动窗口内的所有元素的特点就是连续且长度最短且之和sum大于target
    在这里插入图片描述

2. 算法原理

( 1 ) (1) (1) 初始化
左右边界left=0,right=0
( 2 ) (2) (2) 进窗口
每次进入循环,都让sum+=nums[right],即让新元素进入窗口。

( 3 ) (3) (3) 判断条件
如果sum < target,即leftright范围内所有元素的和小于目标值,此时需要继续让新元素进窗口,即right++
如果sum >= target,即窗口内所有元素的和大于等于目标值;

( 4 ) (4) (4) 更新结果
sum >= target时,连续子数组的和满足了条件,即得到了一个结果长度curlen = right - left + 1,需要把得到的结果长度curlen与当前的最短长度minlen取得最短的更新minlen的值。

( 5 ) (5) (5) 出窗口
sum >= target时,以left为起点的连续子数组的和到right位置就已经满足题意了,right后的所有元素没有必要判断了,故让当前left位置元素出窗口,即sum-=[left]且left右移left++;之后返回第三步的判断条件处,继续判断sumtarget的关系,直到满足sum<target时结束判断,然后进入下一次循环。

( 6 ) (6) (6) 滑动窗口有着基本的解题思路,上述的第四步更新结果不一定是在判断条件满足之后才更新的(本题是这样),这与具体的题目要求相关。也可能是在进入循环且判断条件之前就可以更新结果,也可能是在结束整个循环后才更新结果(全部结束时)。

3. 时间复杂度

O ( n ) O(n) O(n)

只看代码来说,也许你会认为时间复杂度是 O ( n 2 ) O(n^2) O(n2),其实这并不正确。在我们对滑动窗口进行分析时,leftright同向移动且不回退,最差的情况是left走到nright走到n,二者是相加的关系,即时间复杂度是O(n)

3. 代码实现

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int minlen = INT_MAX;int l =0, r = 0;int sum = 0;while(r < nums.size()){sum += nums[r];// 1.进窗口while(sum >= target){// 2.判断minlen = min(minlen, r - l + 1);// 4.更新结果sum -= nums[l];// 3.出窗口l++;}r++;}return minlen == INT_MAX ? 0 : minlen;}
};

4. 知识与收获

( 1 ) (1) (1) 滑动窗口(同向双指针)本质就是基于求解过程中隐藏的单调性特点,帮助我们省去了众多无效的判断。
( 2 ) (2) (2) 每一次循环都会让新元素进入窗口,窗口内元素的和也增加;
( 3 ) (3) (3) 在旧元素从左侧出窗口时是循环出去的方式,因为一次只会出一个元素,而出元素之后的和可能还是大于等于目标值;


T h e The The E n d End End

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

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

相关文章

5款可以免费使用的 UI 设计软件

在我们分享五个有用的原型工具之前&#xff0c;完成原型并优化界面。这是 UI 设计师的任务。UI 设计软件对设计师来说非常重要。UI 设计工具的使用是否直接影响最终结果&#xff0c;然后有人会问&#xff1a;UI 界面设计用什么软件&#xff1f;一些 UI 设计师和对 UI 设计感兴趣…

《深入Linux内核架构》第2章 进程管理和调度 (1)

目录 前言 2.1 进程优先级 2.2 进程生命周期 2.3 进程表示 2.3.1 进程类型 2.3.2 命名空间 2.3.3 进程ID号 2.3.4 进程关系 2.4 进程管理相关的系统调用 2.4.1 进程复制 2.4.2 内核线程 2.4.3 启动新程序 2.4.4 退出进程 前言 本章内容太多&#xff0c;分为两篇博…

2024年无人直播是否已经成为新趋势,商家使用矩图AI无人直播月均增长5万+

无论是 个体商户、企业经营者、电商从业者、想创业赚钱的朋友;也不管你是做餐饮还是非餐饮;亦或是抖音小时达外卖。这篇文章&#xff0c;请勿必看完&#xff0c;对你的业绩增长是有绝对的帮助。 无人直播的发展经历了几个时代&#xff0c;现在已经到了4.0的时代&#xff0c;更安…

记最近一次面试,被阿里P8测开虐惨了...

都说金三银四涨薪季&#xff0c;我是着急忙慌的准备简历——5年软件测试经验&#xff0c;可独立测试大型产品项目&#xff0c;熟悉项目测试流程...薪资要求&#xff1f;5年测试经验起码能要个20K吧 我加班肝了一页半简历&#xff0c;投出去一周&#xff0c;面试电话倒是不少&a…

第16届大广赛HBN命题资料详情

2024年3月8日&#xff0c;大广赛官方网站公布了4个新的品牌命题&#xff0c;其中就包含了HBN。 HBN功效护肤品牌创立于2019年&#xff0c;以“拥有看得见效果”的创新理念&#xff0c;致力于让用户把每一分钱都花在有效成分上&#xff0c;并一直以实际行动践行品牌“真功效”诺…

cad转shp再转3dtiles生成白模

1、准备CAD数据 2、arcgis中添加cad数据 添加面 cad中的标高字段是能带进arcgis中的&#xff0c;如果这个数据是建筑高度&#xff0c;可以直接用了 3、转shp 4、shp转3dtiles白模 cesiumlab中shp转3dtiles白模效果一

❤️算法笔记❤️-(每日一刷-141、环形链表)

文章目录 题目思路解法 题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接…

解锁App推广新姿势:Xinstall二维码信息获取秘籍

在移动互联网时代&#xff0c;App推广已成为各大企业和开发者必不可少的一项工作。而在推广过程中&#xff0c;二维码作为一种便捷的下载和安装方式&#xff0c;被广泛应用于各种场景。然而&#xff0c;如何有效获取并利用这些二维码信息&#xff0c;却成为了一个令人头疼的问题…

Java JUC 笔记(2)

Java JUC 笔记&#xff08;2&#xff09; 锁框架 JDK5以后增加了Lock接口用来实现锁功能&#xff0c;其提供了与synchronized类似的同步功能&#xff0c;但是在使用时手动的获取和释放锁 Lock和Condition锁 这里的锁与synchronized锁不太一样&#xff0c;我们可以认为是Loc…

用户和组及权限管理

用户至少属于一个组,在创建时如果不指定组,将会创建同名的组 用户只能有一个基本组(主组),但可以隶属于多个附加组 如果一个组作为某用户的基本组,此组将不能被删除 UID: 用户标识 GID: 组的标识 root管理员的uid及gid 都为0 用户的配置文件: 1./etc/passwd test:x:1000:1000…

基于官方的docker镜像,制作自定义的私有镜像(以前端node为例)

一、背景 我们难免会有定制docker image的需求&#xff0c;本文就以前端项目依赖的Node环境为例&#xff0c;讲述如何把自定义的镜像由一个私库推送到另外一个私库的场景。 本文分为两部分&#xff0c;一是编写定制的Dockerfile文件&#xff1b;二是把harbor私库的镜像推送到…

Sharding sphere分库分表

需要物理自己实现分表分库&#xff0c;然后通过配置文件配置。 配置文件&#xff1a; 需要配置多个数据源&#xff0c;主从表的关系【默认主表修改&#xff0c;从表读取】&#xff0c;定义分库的策略【比如User id】和分表【表Id】的策略 分库和分表策略&#xff1a;分库策略…