leetcode 209. 长度最小的子数组(优质解法)

代码:

//时间复杂度 O(N) ,空间复杂度 O(1)
class Solution {//采用滑动窗口的方法解决public int minSubArrayLen(int target, int[] nums) {int numsLength=nums.length;int minLength=Integer.MAX_VALUE;int left=0;int right=0;int sum=0;while (right<numsLength){sum+=nums[right];while (sum>=target){//sum 符合要求//以当前 left 指针指向的数的最小子数组已经找到minLength=Math.min(minLength,right-left+1);sum-=nums[left++];}//sum 不符合要求right++;}if(minLength==Integer.MAX_VALUE){minLength=0;}return minLength;}
}

题解:

        该题我们可以采用滑动窗口的方法来解决,对于子数组,字串的题都经常用到滑动窗口的解决方法

        我们要想获得长度最小的子数组,首先就能够想到一种暴力方法,就是去获取数组中的所有子数组,再进行遍历找到符合条件且长度最小的子数组,而滑动窗口的解决方法是基于该思想实现的,但是进行了优化

        我们以题目中的示例 1 作为例子,输⼊: target = 7, nums = [2,3,1,2,4,3]

        1.首先我们用两个指针 L 和 R 指向下标为 0 的位置,用来进行遍历(它们两个遍历的规则不同),现在 L 和 R 指针之间便是我们此时要讨论的子数组,我们定义一个 sum 变量来表示此时子数组的长度,sum+= nums[ R ] ,此时子数组的和为 2 小于 target,所以我们需要扩大子数组

2        3        1        2        4        3

L

R

        2.将 R 指针向后移一位后,子数组的总和相比于之前多了 3,sum+= nums[ R ] =5 < target,于是我们还需要将 R 指针向后移,直到子数组的总和符合条件为止

2        3        1        2        4        3

L

          R

        3.当 R 指针一直移动到如下位置时,L 指针和 R 指针之间子数组的总和为 2+3+1+2 > target,符合条件,于是取变量 minLength 和当前子数组长度的最小值进行保存,由于这是得到的第一个最小长度,所以 minLength 记录此时的长度4,这里有个细节,记录此时的长度以后我们还需要让 R 指针继续向右移动吗 ?答案是不需要,因为我们已经获得了以 L 指针指向的数据为开头且符合条件的长度最小的子数组,当我们让 R 继续向右移动,由于 nums 是一个正整数的数组,所以得到的子数组是一定符合条件的,但是长度增加了 1 ,而我们要的是最小的子数组长度,这里长度增加 1 是完全没有必要的,所以肯定不会是我们要获取的答案

2        3        1        2        4        3

L

                              R

        4.以当前 L 指针为开头的最小子数组长度我们已经获取到了,所以可以让 L 指针向右移动,讨论以下一个数据为开头的最小子数组长度,sum -= nums[ L ] = 6,这里有个细节,我们需要让 R 指针回到 L 指针所在的位置进行遍历吗?答案是不需要,因为当 R 指针指向当前位置并且加上 L 指针之前指向的数据才符合要求,所以当 L 指针移动后,R指针至少要在当前位置才可能符合要求,此时 sum = 6 < target ,于是需要 R 指针向右移动扩大子数组的总和

2        3        1        2        4        3

          L

                              R

        5.接下来就是循环的操作了,当 R 指针指向 nums.length 的位置时循环结束

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

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

相关文章

FindSecBugs支持的检测规则

很多SAST集成了FindSecBugs这个开源工具&#xff0c;其好处是直接对Class文件进行检测&#xff0c;也就是直接检测二进制问题&#xff0c;可以直接检测war、jar&#xff0c;还是非常方便的。虽然误报率较高&#xff0c;但是这些检测出来的安全漏洞很多是安全从业人员耳熟能详的…

【SpringBoot】讲清楚日志文件lombok

文章目录 前言一、日志是什么&#xff1f;二、⽇志怎么⽤&#xff1f;三.自定义打印日志3.1在程序中得到日志对象3.2使用日志打印对象 四.⽇志级别4.1日志级别有什么用4.2 ⽇志级别的分类与使⽤ 五.日志持久化六.lombok6.1添加lobok依赖注意&#xff1a;使⽤ Slf4j 注解&#x…

linux 内核进程管理介绍

Linux内核进程管理是操作系统中非常重要的一部分&#xff0c;它负责管理和调度系统中的进程。本文将介绍Linux内核进程管理的工作原理、调度算法等方面的内容。 一、进程的创建和销毁 在Linux中&#xff0c;进程的创建通过fork()系统调用完成。fork()会创建一个子进程&#xf…

Linux 多线程(C语言) 备查

基础 1&#xff09;线程在运行态和就绪态不停的切换。 2&#xff09;每个线程都有自己的栈区和寄存器 1&#xff09;进程是资源分配的最小单位&#xff0c;线程是操作系统调度执行的最小单位 2&#xff09;线程的上下文切换的速度比进程快得多 3&#xff09;从应用程序A中启用应…

Linux系列-1 Linux启动流程——init与systemd进程

背景&#xff1a; 最近对所有项目完成了一个切换&#xff0c;服务管理方式由&#xff1a; init-> systemd。对相关知识进行总结一下。 1.启动流程 服务器的整体启动流程如下图所示&#xff1a; POST&#xff1a; 计算机通电后进行POST( Power-On Self-Test )加电自检&am…

linux之buildroot(3)配置软件包

Linux之buildroot(3)配置软件包 Author&#xff1a;Onceday Date&#xff1a;2023年11月30日 漫漫长路&#xff0c;才刚刚开始… 全系列文章请查看专栏: buildroot编译框架_Once_day的博客-CSDN博客。 参考文档&#xff1a; Buildroot - Making Embedded Linux Easymdev.t…

Hdoop学习笔记(HDP)-Part.17 安装Spark2

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

canvas 轮廓路径提取效果

前言 微信公众号&#xff1a;前端不只是切图 轮廓 对内容做border效果&#xff0c;可以先看下代码运行的效果 内容是黑线构成的五角星&#xff0c;其轮廓就是红线的部分&#xff0c;本文主要介绍如何在canvas中实现这种效果 Marching Square 这里运用到的是marching square算法…

单页面应用

单页面应用 1.什么是SPA 多页面应用&#xff1a;每个页面都是独立的html文件&#xff0c;页面切换是整体刷新&#xff0c;需要重新加载html、css、JS等文件&#xff0c;容易实现搜索引擎&#xff0c;数据通过url、cookie、localStore传递。 单页面应用&#xff1a;多个页面是…

redis.conf官方配置文件及sentinel.conf官方配置文件

目录 redis.conf配置文件 sentinel.conf配置文件 版本7.0.14 redis.conf配置文件 # Redis configuration file example. # # Note that in order to read the configuration file, Redis must be # started with the file path as first argument: # # ./redis-server /pat…

鸿蒙是Android套壳么,当然不是,ArkTS还是很有意思的

前段时间看新闻&#xff0c;说是明年开始鸿蒙就要和andorid脱钩了。 大概就是这样的&#xff1a; 看到这个&#xff0c;我兴趣就来了。我有个华为P30&#xff0c;升级过鸿蒙系统&#xff0c;用起来也没啥变化&#xff0c;兼容andorid应用&#xff0c;然后就是开机去掉了Powere…

详细学习Pyqt5的20种输入控件(Input Widgets)

Pyqt5相关文章: 快速掌握Pyqt5的三种主窗口 快速掌握Pyqt5的2种弹簧 快速掌握Pyqt5的5种布局 快速弄懂Pyqt5的5种项目视图&#xff08;Item View&#xff09; 快速弄懂Pyqt5的4种项目部件&#xff08;Item Widget&#xff09; 快速掌握Pyqt5的6种按钮 快速掌握Pyqt5的10种容器&…

数据库表的管理

表的基本概念 表是包含数据库中所有数据的数据库对象。数据在表中的组织方式与在电子表格中相似&#xff0c;都是 按行和列的格式组织的。每行代表一条唯一的记录&#xff0c;每列代表记录中的一个字段。例如&#xff0c;在包含公 司员工信息的表中&#xff0c;每行代表一名员工…

19.字符串——查找三个字符串中的最大字符串(打擂台)

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 四、举一反三总结 前言 本系列为字符串处理函数编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 查找三个字符串中的最大字符串 二、题目分析 打擂台 三、解题 程序运行代码 #include<…

从零开始:PHP实现阿里云直播的简单方法!

1. 配置阿里云直播的推流地址和播放地址 使用阿里云直播功能前&#xff0c;首先需要在阿里云控制台中创建直播应用&#xff0c;然后获取推流地址和播放地址。 推流地址一般格式为&#xff1a; rtmp://{Domain}/{AppName}/{StreamName}?auth_key{AuthKey}-{Timestamp}-{Rand…

计算机 Wi-Fi 掉线后重新连接并恢复网络访问(GPT4)

以下是一个详细的批处理脚本&#xff0c;用于在计算机 Wi-Fi 掉线后重新连接并恢复网络访问&#xff1a; 以下结果为GPT4给出的答案 echo off echo 断开当前 Wi-Fi 连接... netsh wlan disconnect timeout /t 3 echo.echo 重置网络适配器... netsh interface set interface &…

如何使用手机制作证件照

1、打开vx搜索小&#x1f34a;x名称&#xff1a;标准证件照免冠照 2、选择你需要的证件照尺寸类型 3&#xff0e;选择手机照片生活照或者点击开始拍摄&#xff08;建议纯色的墙面好换底色&#xff09; 4&#xff0e;选择背景颜色&#xff0c;红底&#xff0c;蓝底奉背景颜色随你…

数据库管理-第121期 我为什么写文章(202301203)

数据库管理-第121期 我为什么写文章&#xff08;202301203&#xff09; 其实呢~大周末我不是太想写文章的&#xff0c;周五HaloDB起了个头还有一堆可以做的事情都计划到下周了&#xff0c;但是昨天发生了一件事情&#xff0c;让我很是不开心&#xff1a;强盗逻辑&#xff0c;白…

工业机器视觉megauging(向光有光)使用说明书(十四,轻量级的visionpro)

程序中如何调用动态库并运行&#xff0c;取出结果呢? 我们这一节就介绍一下&#xff1a; 第一&#xff0c;取一帧图像&#xff0c;传给工具组运行一下&#xff08;即工具组运行一次&#xff09;&#xff1a; meGaugingExt1.ToolGroupRun();//这个就是我们相机1运行一次&…

前端入门(五)Vue3组合式API特性

文章目录 Vue3简介创建Vue3工程使用vite创建vue-cli方式 常用 Composition API启动项 - setup()setup的执行时机与参数 响应式原理vue2中的响应式vue3中的响应式ref函数reactive函数reactive与ref对比 计算属性 - computed监视属性 - watchwatchEffect Vue3生命周期自定义hook函…