【算法】滑动窗口破解长度最小子数组

在这里插入图片描述

Problem: 209. 长度最小的子数组

文章目录

  • 题意分析
  • 算法原理讲解
    • 暴力枚举O(N^2)
    • 利用单调性,滑动窗口求解
  • 复杂度
  • Code

题意分析

首先来分析一下本题的题目意思

  • 题目中会给到一个数组,我们的目的是找出在这个数组中 长度最小的【连续】子数组,而且要返回这个子数组的长度

1.jpg

  • 那我们首先来看示例1,在所找出的所有连续的子数组后,我们需要去比较谁的长度比较短一些,然后去选择短一些的这个子数组

2.jpg

  • 下面们我们看这个示例3,其最后的返回长度为0,原因就在于给出的整型数组中所有数之和还是没有超过target,所以呢就返回了0

3.jpg

💬 但是要如何去寻找这个最小的子数组呢,我们马上来揭晓🖐

算法原理讲解

我们通过分析此题的算法原理来看看该如何去进行求解

暴力枚举O(N^2)

首先第一种,还是我们最熟悉的暴力解法

  • 不过也是要使用到双指针的,我们从0的位置开始向后遍历

4.jpg

5.jpg

6.jpg

7.jpg

  • 好,通过上面的这个图示,我们可以清晰地看出经过right的不断后移中,我们发现了一组长度> target的数据。但是呢我们这里使用的是【暴力枚举】,所以此时还会继续向后进行遍历操作→

可以观察到,当这个right继续后移将所遍历到的数加到sum上去的时候,虽然sum的大小是比target来得大了,但是呢这个len 的长度也相对应地发生可增长,这个其实的话就不对了,因为题目中所要求我们的是求解 最小子数组的长度

8.jpg

利用单调性,滑动窗口求解

看了上面的部分思路后,确实觉得暴力解法不可行,所以我接下去会使用【滑动窗口】的思想去做一个优化的操作

  • 我们可以将left向后移动一位,此时子数组的和即为当前的sum减去left刚刚所指位置的那个数,即为【6】,那么我们在计算整个子数组的和时就可以不用让right重新开始遍历计算

9.jpg

💬 对于上面的这种 “同向移动的指针” 我们就称之为【滑动窗口】,读者可以看看下面的这个动图

滑动窗口演示.gif

那接下去呢我就来叙述一下如何使用【滑动窗口】的思想

  1. left = 0, right = 0
  2. 数据进窗口
  3. 判断当前数据是否超过了目标值target
    1. 更新结果,数据出窗口
  4. 继续循环往复
  • 读者可以通过看下面的算法流程图,让后配合后面的代码,来思考这个滑动窗口的奇妙之处

10.jpg

💬 那有读者一定会问了,怎么能保证这个滑动窗口一定是正确的呢?

  • 虽然在这里我们并没有像暴力枚举那样列出的可能性然后再去比较,但是呢我们可以知道接下来的情况枚举了也是白枚举,所以呢我们利用【单调性】,规避了很多没有必要的枚举行为

复杂度

  • 时间复杂度:

对于时间复杂度, 等会读者在看代码的时候可以看到是存在两个嵌套的循环,所以就自认为是 O ( n 2 ) O(n^2) O(n2),但是呢这里的时间复杂度应该是 O ( n ) O(n) O(n)才对

  • 我们通过看下面的这张图来理解一下,leftright指针在移动的时候都是一步步走的,当最后right指针移动到末尾结束的时候,我们考虑最坏的情况,就是两个指针分别都遍历了一遍这个数组, 2 O ( n ) 2O(n) 2O(n)时间复杂度即为 O ( n ) O(n) O(n)

11.jpg

  • 空间复杂度:

没有开出任何多余的空间,那么空间复杂度即为 O ( n ) O(n) O(n)

Code

以下即为滑动窗口的代码

  • 注意最后在返回的时候要判断这个len是否有做更新,如果还是为最初的INT_MAX的话就不对了
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n = nums.size();int sum = 0;int len = INT_MAX;for(int left = 0, right = 0; right < n; ++right)    {sum += nums[right];     // 进窗口while(sum >= target){len = min(len, right - left + 1);   // 更新最短长度sum -= nums[left++];        // 出窗口}}return len == INT_MAX ? 0 : len;}
};

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

latexocr安装过程中遇到的问题解决办法

环境要求&#xff1a;需要Python版本3.7&#xff0c;并安装相应依赖文件 具体的详细安装步骤可见我上次写的博文&#xff1a;Mathpix替代者|科研人必备公式识别插件|latexocr安装教程 ‘latexocr‘ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件的相关解决办…

无线感知之手势识别模型:Widar 3.0

目录 一、前言 二、无线感知 三、国内的一些工作 四、WiFi 手势识别模型&#xff1a;Widar 3.0 一、前言 最近不少人吐槽WiFi CSI定位已经做无可做了&#xff0c;也发不了什么好的期刊&#xff0c;顶多冲一个SCI 2区。回首WiFi 指纹定位这块&#xff0c;RSS指纹定位已经发…

Leetcode 剑指 Offer II 045. 找树左下角的值

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底…

从零开始—【Mac系统】MacOS配置Java环境变量

系统环境说明 Apple M1 macOS Ventura 版本13.5.2 1.下载JDK安装包 Oracle官网下载地址 JDK下载【注&#xff1a;推荐下载JDK8 Oracle官网JDK8下载】 关于JDK、JRE、JVM的关系说明 JDK(Java Development Kit&#xff0c;Java开发工具包) &#xff0c;是整个JAVA的核心&#…

【完全二叉树魔法:顺序结构实现堆的奇象】

本章重点 二叉树的顺序结构堆的概念及结构堆的实现堆的调整算法堆的创建堆排序TOP-K问题 1.二叉树的顺序结构 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构…

SpringMVC自定义注解---[详细介绍]

一&#xff0c;对于SpringMVC自定义注解概念 是一种特殊的 Java 注解&#xff0c;它允许开发者在代码中添加自定义的元数据&#xff0c;并且可以在运行时使用反射机制来获取和处理这些信息。在 Spring MVC 中&#xff0c;自定义注解通常用于定义控制器、请求处理方法、参数或者…

3、靶场——Pinkys-Place v3(3)

文章目录 一、获取flag41.1 关于SUID提权1.2 通过端口转发获取setuid文件1.3 运行pinksecd文件1.4 利用nm对文件进行分析1.5 构建payload1.6 Fire 二、获取flag52.1 生成ssh公钥2.2 免密登录ssh2.3 以pinksecmanagement的身份进行信息收集2.4 测试程序/usr/local/bin/PSMCCLI2.…

基于matlab实现的额 BP神经网络电力系统短期负荷预测未来(对比+误差)完整程序分享

基于matlab实现的额 BP神经网络电力系统短期负荷预测 完整程序&#xff1a; clear; clc; %%输入矢量P&#xff08;15*10&#xff09; P[0.2452 0.1466 0.1314 0.2243 0.5523 0.6642 0.7105 0.6981 0.6821 0.6945 0.7549 0.8215 0.2415 0.3027 0; 0.2217 0.1581 0.1408 0.23…

JS-ECharts-前端图表 多层级联合饼图、柱状堆叠图、柱/线组合图、趋势图、自定义中线、平均线、气泡备注点

本篇博客背景为JavaScript。在ECharts在线编码快速上手&#xff0c;绘制相关前端可视化图表。 ECharts官网&#xff1a;https://echarts.apache.org/zh/index.html 其他的一些推荐&#xff1a; AntV&#xff1a;https://antv.vision/zh chartcube&#xff1a;https://chartcub…

【力扣1464】数组中两元素的最大乘积

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述二、题目分析1、排序2、最值模拟 一、题目描述 题目链接&#xff1a;数组中两元素的最大乘积 给你一个整数数…

基于SSM的社区志愿者招募系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

ERR_CONNECTION_REFUSED等非标准的HTTP错误状态码原因分析和解决办法

文章目录 一、DNS Resolution Failed1&#xff0c;DNS服务器故障2&#xff0c;DNS配置错误3&#xff0c;DNS劫持4&#xff0c;域名过期-5&#xff0c;其他网络问题 二、ERR_CONNECTION_REFUSED-"ERR_CONNECTION_REFUSED" 错误可能有多种原因 三、ERR_SSL_PROTOCOL_ER…

组队竞赛(int溢出问题)

目录 一、题目 二、代码 &#xff08;一&#xff09;没有注意int溢出 &#xff08;二&#xff09;正确代码 1. long long sum0 2. #define int long long 3. 使用现成的sort函数 一、题目 二、代码 &#xff08;一&#xff09;没有注意int溢出 #include <iostream&g…

CoreData 在新建或更新托管对象中途发生错误时如何恢复如初?

问题现象 在 CoreData 支持的 App 中,当我们新建或更新托管对象到一半突然出现错误时,应该禁止任何已发生的改变被写入内存或数据库中。不过,有时仍会出现始料未及的“意外”: 从上面的演示可以看到:即使在 Item 对象新建和更新途中出现错误后不执行后续的保存操作,但界…

追光者的梦

追光者的梦 鸿蒙中我茫然于世&#xff0c;你是钻入我心里的那束光 我所有的梦想都是和你热烈的拥抱 没有追到你时&#xff0c;我一直在路上 追到你时&#xff0c;我的人生就被你点燃 ——致所有的追光者 合肥先进光源国家重大科技基础设施项目及配套工程启动会刚开过&…

重新认识架构—不只是软件设计

前言 什么是架构&#xff1f; 通常情况下&#xff0c;人们对架构的认知仅限于在软件工程中的定义&#xff1a;架构主要指软件系统的结构设计&#xff0c;比如常见的SOLID准则、DDD架构。一个良好的软件架构可以帮助团队更有效地进行软件开发&#xff0c;降低维护成本&#xff0…

RestTemplate:简化HTTP请求的强大工具

文章目录 什么是RestTemplateRestTemplate的作用代码示例 RestTemplate与HttpClient 什么是RestTemplate RestTemplate是一个在Java应用程序中发送RESTful HTTP请求的强大工具。本文将介绍RestTemplate的定义、作用以及与HttpClient的对比&#xff0c;以帮助读者更好地理解和使…

建构居住安全生态,鹿客科技2023秋季发布会圆满举办

9月20日&#xff0c;以「Lockin Opening」为主题的2023鹿客秋季发布会在上海隆重举办&#xff0c;面向居住安全领域鹿客带来了最新的高端旗舰智能锁新品、多眸OS1.0、Lockin Care服务以及全联接OPENING计划。此外&#xff0c;现场还邀请了国家机构、合作伙伴、技术专家等业界同…

什么是单点登录?什么又是 OAuth2.0?

对于刚开始接触身份认证的朋友对于单点登录&#xff0c;OAuth2.0&#xff0c;JWT 等等会有诸多疑惑&#xff0c;甚至还会问既然有了 JWT 还拿 单点登录做什么&#xff1f;还拿 OAuth2.0 做什么&#xff1f; 不知做过身份认证的 xdm 看到这里是不是感觉这句话有点迷&#xff1f…

IBMMQ 安装教程(IBM WebSphere MQ 安装教程)- 及 IBMMQ 服务器搭建教程

文章目录 前言一、下载二、安装1. 解压&#xff0c;运行 Setup.exe 文件。2. 启动 IBM WebSphere MQ 安装程序。3. 接受用户协议。4. 选择定制安装。5. 更改安装目录。6. 下一步。7. 下一步。8. 下一步。9. 点击安装。10. 等待安装&#xff0c;完成。11. 准备安装 WebSphere MQ…