【算法笔记】 LeetCode_209 长度最小的子数组

LeetCode_209 长度最小的子数组

LeetCode_209 长度最小的子数组

题目要求

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

找出该数组中满足其总和大于等于target 的长度最小的 连续子数组[nums<sub>l</sub>, nums<sub>l+1</sub>, ..., nums<sub>r-1</sub>, nums<sub>r</sub>] ,并返回其长度**。**如果不存在符合条件的子数组,返回 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 <= 10<sup>9</sup>
  • 1 <= nums.length <= 10<sup>5</sup>
  • 1 <= nums[i] <= 10<sup>5</sup>

思路

使用滑动窗口法,双指针slow和fast分别指示窗口的左右边界,首先快指针开始右移,慢指针不动,同时求和sum开始累加,直到碰到sum>=target,开始考虑 最小 子序列的问题,慢指针尝试右移以缩小窗口大小

代码与解析

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {// 初始化慢指针和快指针,分别指向数组的开始位置int slow = 0;int fast = 0;// 初始化当前子数组的和为0int sum = 0;// 初始化最小子数组长度为数组长度加1,这是为了确保最小长度一定小于数组长度int minLength = nums.size() + 1;// 使用快慢指针法遍历数组while(fast < nums.size() && fast >= slow){// 快指针向前移动,将当前元素加入到当前子数组的和中sum += nums[fast];// 当当前子数组的和大于或等于目标值时,开始尝试缩小子数组的长度while(sum >= target && slow <= fast){// 更新最小子数组长度minLength = minLength > (fast - slow + 1) ? (fast - slow + 1) : minLength;// 如果最小长度已经为1,则不需要继续寻找更小的子数组,直接跳出循环if(minLength == 1){break;}// 慢指针向前移动,将当前元素从当前子数组的和中减去sum -= nums[slow];// 慢指针向前移动slow ++;}// 快指针向前移动fast ++;}// 如果最小长度仍然为初始值,说明没有找到满足条件的子数组,返回0// 否则,返回最小子数组长度return (minLength == (nums.size() + 1)) ? 0 : minLength;}
};

方法和思想

  • 快慢指针法:使用两个指针,一个快指针用于扩大子数组的范围,一个慢指针用于缩小子数组的范围,以此来找到满足条件的最小子数组。
  • 滑动窗口:这种方法实际上是滑动窗口的一种应用,通过调整窗口的大小来找到满足条件的最小窗口。

时间复杂度

  • 时间复杂度:O(n),其中 n 是数组的长度。因为每个元素最多被访问两次,一次是快指针扫描,一次是慢指针缩小窗口。

空间复杂度

  • 空间复杂度:O(1),因为只使用了几个固定的变量,与输入数组的大小无关。

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

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

相关文章

【MySQL】-知识点整理

1、存储引擎 -- 查询数据库支持的存储引擎 show engines; -- 查询当前数据库使用的存储引擎 show variables like %storage_engines%; 主要的存储引擎说明&#xff1a; 1&#xff09;MyISAM&#xff1a;无外键、表锁、所有索引都是非聚簇索引、无事务、记录表总条数、删除表…

基于el-tree实现懒加载穿梭条

一、关键代码 <template><div><!-- 左侧待选列表 --><div class"left-box"><p>待选列表</p><el-input placeholder"输入关键词过滤" v-model"leftFilterText" clearable/><el-treeref"tree…

便捷在线导入:完整Axure元件库集合,让你的设计更高效!

Axure元件库包含基本的工具组件&#xff0c;可以使原型绘制节省大量的重复工作&#xff0c;保持整个设计页面的一致性和标准化&#xff0c;同时显得专业。Axure元件库就像我们日常生活中的门把手、自行车踏板和桌子上的螺丝钉&#xff0c;需要组装才能使用。作为一名成熟的产品…

【Web - 框架 - Vue】随笔 - Vue的简单使用(02) - 快速上手

【Web - 框架 - Vue】随笔 - Vue的简单使用(02) - 快速上手 Vue模板代码 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Vue模板</title> </head> <body> <div id"…

redis 性能优化二

前言 性能优化的第二篇文章&#xff0c;将重点讲一下Redis 的响应延迟&#xff0c;响应延迟如何对redis 进行优化。这个延迟不是说一个命令或者几个命令变慢了&#xff0c;延迟了几秒&#xff0c;就说Redis 变慢了。在不同的软硬件环境下&#xff0c;Redis 本身的绝对性能并不…

[go 面试] 一致性哈希:数据分片与负载均衡的黄金法则

在分布式系统中&#xff0c;一致性哈希&#xff08;Consistent Hashing&#xff09;是一项关键算法&#xff0c;为解决数据分片和负载均衡难题提供了强大的支持。本文将深入研究一致性哈希的核心原理&#xff0c;解析其如何超越传统哈希算法&#xff0c;同时详细探讨一个关键问…

基于STM32开路清障车控制系统设计

目 录 摘 要 I Abstract II 引 言 1 1总体方案论证与设计 3 1.1设计方案 3 1.2主控模块的选型和论证 3 2系统硬件电路设计 5 2.1主控模块设计 5 2.1.1 STM32单片机概述 5 2.1.2 STM32单片机最小系统电路 5 2.2 MCU主要实现功能 6 2.3火焰传感器 7 2.4超声波模块 8 2.5驱动模块…

Docker-自定义镜像

目录 1 前言 2 构建java应用的步骤及镜像结构图 2.1 构建步骤 2.2 镜像结构图 3 Dockerfile常用指令 4 Dockerfile的内容举例 4.1 一般形式 4.2 一般形式的优化 5 构建镜像 5.1 指令 5.2 实操 5.2.1 加载jdk镜像(基础镜像) 5.2.2 构建我们的镜像 5.2.3 使用我们的…

SpringCloud微服务-RabbitMQ快速入门

文章目录 RabbitMQ快速入门1、什么是MQ&#xff1f;2、RabbitMQ概述3、RabbitMQ的结构和概念4、常见消息模型5、HelloWorld RabbitMQ快速入门 1、什么是MQ&#xff1f; MQ &#xff08;MessageQueue&#xff09;&#xff0c;中文是消息队列&#xff0c;字面来看就是存放消息的…

Linux nmcli命令使用教程(nmcli指令)

文章目录 先区分两个概念&#xff1a;网络设备和网络连接网络设备网络连接网络连接的UUID nmcli可以为一个网络设备创建多个网络连接&#xff0c;但同一时刻只有一个能生效 Mastering Network Management with nmcli in Linux&#xff08;掌握Linux中使用nmcli进行网络管理&…

掌握 Vue3、Vite 和 SCSS 实现一键换肤的魔法步骤

前言 一个网站的换肤效果算是一个比较常见的功能&#xff0c;尤其是在后台管理系统中&#xff0c;我们几乎都能看到他的身影&#xff0c;这里给大家提供一个实现思路。 搭建项目 vitevue3搭建项目这里就不演示了&#xff0c;vite官网里面讲得很清楚。 注&#xff1a;这里使…

解决跨域问题的FastAPI应用及常见报错解析

介绍&#xff1a; 跨域问题在前后端分离的Web应用中经常会遇到。FastAPI作为一个快速、现代化的Python Web框架&#xff0c;在处理跨域问题上也提供了一些解决方案。本文将介绍如何使用FastAPI来解决跨域问题&#xff0c;并分析一些常见的报错及解决方法。 正文&#xff1a; …

【Java项目介绍和界面搭建】拼图小游戏——作弊码、查看完整图片

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

实现qq音乐歌词滚动效果

闲来无事&#xff0c;听音乐的时候&#xff0c;突发奇想 实现该效果中&#xff0c;包含了根据声音高低生成音波的功能&#xff0c;有兴趣的直接下载代码即可 这是启动后的效果。

泛微OA本地部署项目

泛微OA本地部署 本文演示脱离公司服务器&#xff0c;在本地搭建泛微 OA。 本次演示的版本如下&#xff1a; ecology&#xff1a;e-9sql server 版本&#xff1a;2012jdk 版本&#xff1a;1.8 一、安装 VmWare、Centos 7 对于 VmWare、Centos 7的安装&#xff0c;此处不再一一…

力扣515. 在每个树行中找最大值(BFS,DFS)

Problem: 515. 在每个树行中找最大值 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1&#xff1a;BFS 套用BFS模板&#xff0c;直接在遍历树的某一层时将当前层的最大值存入数组中 思路2&#xff1a;DFS 回溯思想&#xff0c;在递归时不断更新可选列表&#xff08;根据…

前端每日一练:三栏布局,包括 Flex 布局、浮动布局、Grid 布局以及绝对定位布局。

介绍 在网页开发中&#xff0c;三栏布局是一种常见的结构&#xff0c;通常包括一个固定宽度的左侧栏、一个固定宽度的右侧栏以及一个自适应宽度的主要内容区域。本文将介绍使用不同的布局方式实现三栏布局&#xff0c;包括 Flex 布局、浮动布局、Grid 布局以及绝对定位布局。 …

计算机组成原理面试题

计算机组成原理是计算机科学的基础课程之一&#xff0c;涉及计算机系统的基本结构和工作原理。以下是一些可能出现在面试中的计算机组成原理相关题目&#xff1a; 1. **什么是冯诺依曼体系结构&#xff1f;** - 冯诺依曼体系结构是一种计算机组织架构&#xff0c;它将程序指…

【Flink网络数据传输(3)】RecordWriter的能力:实现数据分发策略或广播到下游InputChannel

文章目录 一.创建RecordWriter实例都做了啥1. 根据recordWrites数量创建不同的代理类2. 创建RecordWriters3. 单个RecordWriter的创建细节 二. RecordWriter包含的主要组件1. RecordWriter两种实现类分别实现分发策略和广播2. ChannelSelectorRecordWriter的发送策略2.1. Chann…

ArmSoM规划开发基于RK3576的开发套件

ArmSoM正计划推出一款新的产品&#xff0c;这款产品将采用强大的RK3576芯片。 本文将为您介绍我们的新产品搭载的RK3576性能参数&#xff0c;以及它如何为您提供卓越的性能和功能。 RK3576处理器 RK3576处理器是一款强大的处理器&#xff0c;具备出色的性能和多样化的功能&a…