【LeetCode题解】LeetCode 209. 长度最小的子数组

【题目链接】
209. 长度最小的子数组
【题目描述】
在这里插入图片描述
【题解】

方法一:滑动窗口

本题可以使用双指针算法,定义两个指针lr分别表示子数组的开始位置和起始位置,sum数组存储的从l到r区间内所有元素的和。初始状态下,lr都指向下标0sum的值为0
每一轮迭代,将nums[r]添加到sum中,如果sum≥target,则更新子数组的最小长度,此时的最小长度为r-l+1,然后将nums[l]sum中减去并将l右移,直到sum<target,在这个过程中同样需要更新子数组的最小长度。
在每一轮迭代后,将r右移。
【AC代码】

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int l = 0, r = 0, n = nums.size();int sum = 0, res = 1e9;while(r < n) {sum += nums[r];while(sum >= target) {res = min(res, r - l + 1);sum -= nums[l];l++;}r++;}if(res == 1e9)return 0;return res;}
};

方法二:前缀和+二分查找

阅读题目可以发现,其中出现了子数组的和,而前缀和算法可以在常数时间内通过前缀和数组计算任意区间的和,避免重复计算,从而提高查询效率。同时,这道题保证了数组中每个元素都为正,所以前缀和一定是递增的,这一点保证了二分的正确性。如果题目没有说明数组中每个元素都为正,这里就不能使用二分来查找这个位置了
为了使用二分查找,需要额外创建一个数组sums用于存储数组nums的前缀和,其中sums[i]表示从nums[0]nums[i−1]的元素和。得到前缀和之后,对于每个开始下标i,可通过二分查找得到大于或等于i的最小下标left,使得sums[left]−sums[i−1]≥target,并更新子数组的最小长度(此时子数组的长度是left−(i−1))。由于二分查找的终止条件是left==right,因此此处找到的最小下标为right或者left
【AC代码】

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n = nums.size();if (n == 0) return 0;int res = 1e9;vector<int> sums(n + 1, 0);for (int i = 1; i <= n; ++i) {sums[i] = sums[i - 1] + nums[i - 1];}// 提前判断整个数组和是否小于target,直接返回0if (sums[n] < target)return 0;for (int i = 1; i <= n; i++) {int left = i, right = n;while (left < right) {int mid = left + right >> 1;if (sums[mid] - sums[i - 1] >= target) {right = mid;} else {left = mid + 1;}}// 检查left是否有效,且对应的和满足条件if (left <= n && sums[left] - sums[i - 1] >= target) {res = min(res, left - i + 1);}}return res == 1e9 ? 0 : res;}
};

【思考&收获】
1.阅读题目,题目要求的是大于等于target的数组,第一次读题的时候看成了等于target,卡住了一段时间。
2.数组中每个元素都为正,则前缀和一定是递增的,这一点保证了二分的正确性,可以考虑使用二分查找。

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

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

相关文章

2025-08-21 Python进阶6——迭代器生成器与with

文章目录1 迭代器与生成器1.1 迭代器1.1.1 基本使用1.1.2 手动迭代&#xff08;带异常处理&#xff09;1.1.3 自定义迭代器1.2 生成器1.2.1 工作原理1.2.2 斐波那契数列示例1.3 推导式1.3.1 列表推导式1.3.2 字典推导式1.3.3 集合推导式1.4.4 元组推导式&#xff08;生成器表达…

C++——C++重点知识点复习2(详细复习模板,继承)

目录 模板 函数模板 类模板 非类型模板参数 模板的特化 函数模板特化 类模板的特化 为什么普通函数可以分离&#xff1f; 继承 继承概念 基类和派生类对象赋值转换&#xff08;切割&#xff0c;切片&#xff09; 隐藏 派生类的默认成员函数 .复杂的菱形继承及菱形…

python 项目编号 2025821 有关于中英文数据的收集、处理

python专栏记录&#xff1a;前言 批量读取单词 JSON 文件 → 解析出单词、释义、例句、短语 → 数据清洗&#xff08;去掉特殊符号&#xff09; → 同步更新到 MySQL 数据库。 内容 import json import pymysql import re import time from pymysql.converters import escape_s…

Document Solutions .NET Bundle 8.2.0

Document Solutions .NET Bundle 8.2.0MESCIUS 的 Document Solutions .NET Bundle 是一套完整的 API 和查看工具&#xff0c;可增强文档处理并提高效率。它包含 Excel、Word、PDF 和图像文档&#xff0c;以及 PDF 查看器、数据查看器和图像查看器的标准许可证。它将强大的 .NE…

在职老D渗透日记day20:sqli-labs靶场通关(第27关)get报错注入 过滤select和union ‘闭合

5.27.第27关 get报错注入 过滤select和union 闭合function blacklist($id) { $id preg_replace(/[\/\*]/,"", $id); //strip out /* $id preg_replace(/[--]/,"", $id); //Strip out --. $id preg_replace(/[#]/,"", $id); //Strip out #. $…

Go 并发编程-channel

channel 文章目录channel简介基本概念类型表示法值表示法操作的特性初始化通道接收元素值Happens before发送值例1核心组件关键执行顺序输出示例&#xff08;可能顺序&#xff09;设计要点例2例3关闭通道长度与容量单向通道主要用途增强代码表达性和安全性&#xff08;最重要的…

开源和免费一样吗?以商城系统为例为您分析~

开源和免费并不完全一样&#xff0c;二者在核心定义、权利范围和实际应用中存在显著区别&#xff0c;具体可以从以下几个方面理解&#xff1a; 1. 核心定义不同开源&#xff08;Open Source&#xff09;&#xff1a; 指软件的源代码是公开可获取的&#xff0c;任何人都可以查看…

CMOS知识点 MOS管饱和区电流公式

知识点16&#xff1a;同上篇一样&#xff0c;MOS管主要有3个工作区域&#xff1a;截止区&#xff08;Cut-off Region&#xff09;&#xff1a; < &#xff0c;没有沟道形成&#xff0c;几乎没有电流。线性区/三极管区&#xff08;Triode Region&#xff09;&#xff1a; &g…

【集合框架LinkedList底层添加元素机制】

在 Java 集合框架中&#xff0c;LinkedList 与 ArrayList 是两种截然不同的线性表实现。如果说 ArrayList 像一个可以伸缩的“盒子阵列”&#xff0c;那么 LinkedList 就像一条由“节点”串联而成的“双向链条”。今天&#xff0c;我们将深入 LinkedList 的源码&#xff0c;一步…

《P2700 逐个击破》

题目背景三大战役的平津战场上&#xff0c;傅作义集团在以北平、天津为中心&#xff0c;东起唐山西至张家口的铁路线上摆起了一字长蛇阵&#xff0c;并企图在溃败时从海上南逃或向西逃窜。为了就地歼敌不让其逃走&#xff0c;指挥官制定了先切断敌人东西两头退路然后再逐个歼灭…

C6.0:晶体管放大器的原理与应用(基极偏置篇)

将晶体管Q点偏置在负载线中点附近后&#xff0c;如果将一个小的交流信号耦合到基极上&#xff0c;便会产生一个交流的集电极电压&#xff0c;交流集电极电压与交流基极电压波形相似&#xff0c;但是幅度要大了很多&#xff0c;即交流集电极电压是对交流基极电压的放大。本篇学习…

Oracle: cannot decrease column length because some value is too big

1.背景今天项目上查不到数据,查库发现默认20位的字段被改为了200,用的还是char类型&#xff0c;填充了一堆空格 2.知识LENGTH() 函数用于计算字符串字段 长度TRIM() 函数用于去除字符串字段 column 前后的空格&#xff08;默认&#xff09;或指定字符&#xff1a;SUBSTR() 用于…

Elasticsearch 写入全链路:从单机到集群

0. 先把术语摆正 Index&#xff08;索引&#xff09;&#xff1a;逻辑数据集合&#xff0c;≈ MySQL 的库。Document&#xff08;文档&#xff09;&#xff1a;一条 JSON 数据&#xff0c;≈ MySQL 的行。Field&#xff08;字段&#xff09;&#xff1a;文档里的键值&#xff0…

Java多线程编程——基础篇

目录 前言 一、进程与线程 1、进程 2、线程 二、并发与并行 1、并发 2、并行 三、线程调度 1、CPU时间片 2、调度方式 ①时间片轮转 ②抢占式调度 四、线程实现方式 1、继承 Thread 类 Thread的多种构造函数&#xff1a; 2、实现 Runnable 接口 五、线程的核心方法 1、start() …

阿里云的centos8 服务器安装MySQL 8.0

在 CentOS 8 上安装 MySQL 8.0 可以通过添加 MySQL 官方 YUM 仓库并使用 dnf 命令安装。以下是具体步骤&#xff1a; 步骤如下&#xff1a; 下载并添加 MySQL 官方 YUM 仓库 运行以下命令下载 MySQL 8.0 的 YUM 仓库配置文件&#xff1a; sudo dnf install https://dev.mysql.…

【运维进阶】Linux 正则表达式

Linux 正则表达式定义&#xff1a;正则表达式是一种pattern&#xff08;模式&#xff09;&#xff0c;用于与待搜索字符串匹配&#xff0c;以查找一个或多个目标字符串。组成&#xff1a;自成体系&#xff0c;由两类字符构成普通字符&#xff1a;未被显式指定为元字符的所有可打…

STM32输入捕获相位差测量技术详解(基于TIM1复位模式)

本文将深入解析基于STM32定时器输入捕获功能的方波相位差测量技术&#xff0c;通过复位模式实现高精度相位检测。以下是完整的代码实现与详细原理分析。一、相位差测量原理相位差测量基于两个同频方波信号下降沿时间差计算。核心原理&#xff1a;​复位模式​&#xff1a;将TIM…

什么是股指期货可转移阿尔法策略?

阿尔法&#xff08;Alpha&#xff09;是投资领域的一个术语&#xff0c;用来衡量投资组合的超额收益。简单来说&#xff0c;阿尔法就是你在市场上赚的比平均水平多出来的那部分钱。比如&#xff0c;市场平均收益率是5%&#xff0c;但你的投资组合收益率是10%&#xff0c;那你的…

AXI GPIO S——ZYNQ学习笔记10

AXI GPIO 同意通道混合输入输出中断控制#KEY set_property IOSTANDARD LVCMOS18 [get_ports {AXI_GPIO_KEY_tri_io[0]}] set_property PACKAGE_PIN J13 [get_ports {AXI_GPIO_KEY_tri_io[0]}] set_property IOSTANDARD LVCMOS18 [get_ports {AXI_GPIO_KEY_tri_io[1]}] set_pro…

如何通过传感器选型优化,为设备寿命 “续航”?

在当今竞争激烈的工业领域&#xff0c;企业就像在一场没有硝烟的战争中角逐&#xff0c;设备便是企业的“秘密武器”。设备的使用寿命&#xff0c;如同武器的耐用程度&#xff0c;直接决定了企业在生产战场上的“战斗力”。延长设备寿命&#xff0c;已然成为众多企业降低生产成…