专题二 -滑动窗口 - 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

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

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

相关文章

找不到duilib.dll:是什么文件?如何解决

当你尝试打开某个程序软件时&#xff0c;你可能会看到一条错误信息&#xff0c;提示你缺失一个名为“duilib.dll”的文件。这个文件通常与程序开发中使用的UI框架相关&#xff0c;缺失它会导致程序无法正常运行。那么&#xff0c;如何解决这个问题呢&#xff1f;本文将为你提供…

如何使用固定公网地址SFTP远程传输文件至安卓Termux本地目录?

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

Nexus - Maven私服构建和使用

文章目录 1. Maven 私服简介2. Nexus下载安装3. 如何使用Nexus私服3.1 通过Nexus下载Jar包3.2 将Jar包部署到Nexus3.3 引用别人部署的jar包 1. Maven 私服简介 Maven 私服是一种特殊的Maven远程仓库&#xff0c;它是架设在局域网内的仓库服务&#xff0c;用来代理位于外部的远…

Springboot+vue的高校危化试剂仓储系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的高校危化试剂仓储系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#x…

01_04_JavaWEB02_JavaScript

JavaScript 参考尚硅谷再总结复习 一 JS简介 1.1 JS起源 Javascript是一种由Netscape(网景)的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言&#xff0c;主要目的是为了解决服务器端语言&#xff0c;遗留的速度问题&#xff0c;为客户提供…

Linux多线程之线程同步

(&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨&#xff01;你好这里是ky233的主页&#xff1a;这里是ky233的主页&#xff0c;欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 目录 一、线程同步的概念 二、条件变量 1.概念 2…

中型企业运维总监的成本优化实战案例——自建IDC机房

早期互联网快速发展的时候&#xff0c;相关领域的公司更注重拓展业务。 为了快速占领市场&#xff0c;他们往往投入了较高的成本。 但近年来&#xff0c;随着互联网人口红利的逐渐消退以及疫情的影响&#xff0c;越来越多的企业开始重视成本管理&#xff0c;从“粗放式经营”向…

使用J-Link Commander通过J-LINK以命令的形式来访问ARM通用MCU

通常我们的操作是写好程序然后将程序下载到芯片里面&#xff0c;然后运行程序来进行相应的操作&#xff0c;其实还可以使用 J − L i n k C o m m a n d e r J-Link\quad Commander J−LinkCommander通过 J − L I N K J-LINK J−LINK以命令的形式来简单访问ARM通用MCU&#xf…

Hadoop运行搭建——系统配置和Hadoop的安装

Hadoop运行搭建 前言&#xff1a; 本文原文发在我自己的博客小站&#xff0c;直接复制文本过来&#xff0c;所以图片不显示(我还是太懒啦&#xff01;)想看带图版的请移步我的博客小站~ Linux镜像&#xff1a;CentOS7 系统安装&#xff1a;CentOS安装参考教程 系统网卡设置…

微信私信短剧机器人源码

本源码仅提供参考&#xff0c;有能力的继续开发 接口为api调用 云端同步 https://ys.110t.cn/api/ajax.php?actyingshilist 影视搜索 https://ys.110t.cn/api/ajax.php?actsearch&name剧名 每日更新 https://ys.110t.cn/api/ajax.php?actDaily 反馈接口 https://ys.11…

SpringCloud-Alibaba-Nacos教程

SpringCloud-Alibaba-Nacos教程 下载地址 https://github.com/alibaba/nacos/releases/tag/2.2.3 直接进入bin包 运行cmd命令 startup.cmd -m standalone 运行成功后 进入nacos可视化页面 账号密码默认都是nacos http://localhost:8848/nacos 微服务入驻Nacos服务注册…

从 iPhone 设备恢复误删微信消息的 4 种方法

您的微信消息可能会因无意删除、系统崩溃、卸载微信应用或升级过程失败而被删除。如果您遇到这种情况&#xff0c;您不必担心&#xff0c;因为您可以采取某些步骤来恢复丢失的微信历史记录。这里有 4 种方法可以帮助您从 iPhone恢复丢失的微信消息、群聊历史记录或微信联系人。…

JMH287亲测【鸣潮】一键内测风景端V1.0.2已整理并录制视频教学

资源介绍&#xff1a; 否需要虚拟机&#xff1a;否 文件大小&#xff1a;压缩包约15G 支持系统&#xff1a;win7、win10、win11 硬件需求&#xff1a;运行内存16G 4核及以上CPU独立显卡 资源截图&#xff1a; 下载地址&#xff1a; JMH287【鸣潮】一键端 [V1.0.2]

算法学习08:Trie树(字典树)、并查集

算法学习08&#xff1a;Trie树&#xff08;字典树&#xff09;、并查集 文章目录 算法学习08&#xff1a;Trie树&#xff08;字典树&#xff09;、并查集前言一、Trie树&#xff08;字典树&#xff09;二、并查集1.例题1&#xff1a;合并 判断2.例题2&#xff1a;合并 判断 …

ChatGPT发不出消息?GPT发不出消息怎么办?

前言 今天发现&#xff0c;很多人的ChatGPT无法发送信息&#xff0c;我就登陆看一下自己的GPT的情况&#xff0c;结果还真的无法发送消息&#xff0c;ChatGPT 无法发送消息&#xff0c;但是能查看历史的对话&#xff0c;不过通过下面的方法解决了。 第一时间先打开官方的网站&a…

STM32---通用定时器(一)理论基础

写在前面&#xff1a;在STM32F103中有众多的定时器&#xff0c;其中包括两个基本定时器&#xff0c;基本定时器的内容已经在上节进行了介绍&#xff0c;基本定时器的功能、结构、使用都较为简单。而STM32F1中还含有4个通用定时器&#xff08;TIM2\3\4\5&#xff09;,这些定时器…

Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理

Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理一、Unity中 屏蔽透明区域的点击事件1.1 使用Image组件自带的参数检测1.2 根据点击的坐标计算该点的像素值是否满足阈值 二、Unity中屏蔽 不规则图片按钮点击的事件 总结 &#x1f3ac; 博客主页&#xff1a;htt…

剑指offer经典题目整理(二)

一、斐波那契数列&#xff08;fib&#xff09; 1.链接 斐波那契数列_牛客题霸_牛客网 (nowcoder.com) 2.描述 斐波那契数列就是数列中任意一项数字&#xff0c;都会等于前两项之和&#xff0c;满足f(n) f(n-1) f(n-2) 的一个数列&#xff0c;例如&#xff1a;1 1 2 3 5 8…

JVM知识整体学习

前言&#xff1a;本篇没有任何建设性的想法&#xff0c;只是我很早之前在学JVM时记录的笔记&#xff0c;只是想从个人网站迁移过来。文章其实就是对《深入理解JVM虚拟机》的提炼&#xff0c;纯基础知识&#xff0c;网上一搜一大堆。 一、知识点脑图 本文只谈论HotSpots虚拟机。…

2024年腾讯云8核16G服务器性能测试和并发数测试

腾讯云8核16G轻量服务器CPU性能如何&#xff1f;18M带宽支持多少人在线&#xff1f;轻量应用服务器具有100%CPU性能&#xff0c;18M带宽下载速度2304KB/秒&#xff0c;折合2.25M/s&#xff0c;系统盘为270GB SSD盘&#xff0c;月流量3500GB&#xff0c;折合每天116.6GB流量&…