长度最小的子数组(滑动窗口)
给定一个含有 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 <= 1091 <= nums.length <= 1051 <= nums[i] <= 104
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int left = 0, sum = 0;int n = nums.size();int min_length = INT_MAX;for (int right = 0; right < n; ++right) {sum += nums[right];while (sum >= target) {min_length = min(min_length, right - left + 1);sum -= nums[left];left++;}}return min_length == INT_MAX ? 0 : min_length;}
};
由于子数组 是数组中连续的 非空 元素序列。这意味着,在一个数组中选择的元素必须彼此相邻,才能构成一个子数组。
滑动窗口是一种在数组或字符串等线性数据结构上高效地解决子区间问题的方法。问题的核心在于找到一个和大于等于 target 的最短连续子数组。为了高效地找到这个子数组,我们可以使用滑动窗口
初始化定义 left 指针为窗口的左边界,right 指针为窗口的右边界。用 sum 变量记录窗口内元素的和,用 min_length 变量存储满足条件的最小子数组长度。
用 right 指针遍历数组,将每个元素值加入 sum。这样做的目的是逐步扩大窗口,尝试找到满足条件(sum >= target)的子数组
当 sum 大于等于 target 时,说明当前窗口已经符合条件。此时更新 min_length
为了找到更小的满足条件的子数组长度,我们尝试通过增加 left 来缩小窗口。将 nums[left] 从 sum 中减去,然后将 left 向右移动一格,缩小窗口范围。不断重复该过程,直到 sum 小于 target 为止。
遍历结束后,min_length 会记录符合条件的最小长度。如果 min_length 仍为初始化值,说明没有满足条件的子数组,返回 0;
实例:
target = 7nums = [2, 3, 1, 2, 4, 3]
初始化变量:
left = 0,sum = 0,min_length = INT_MAX
遍历数组,右指针 right 从 0 到 nums.size() - 1:
第一步:right = 0
- 将
nums[0] = 2加到sum中,sum = 2。 sum < target,不满足条件,继续扩展窗口。
第二步:right = 1
- 将
nums[1] = 3加到sum中,sum = 2 + 3 = 5。 sum < target,继续扩展窗口。
第三步:right = 2
- 将
nums[2] = 1加到sum中,sum = 5 + 1 = 6。 sum < target,继续扩展窗口。
第四步:right = 3
- 将
nums[3] = 2加到sum中,sum = 6 + 2 = 8。 sum >= target,窗口满足条件,计算当前窗口长度right - left + 1 = 3 - 0 + 1 = 4。- 更新
min_length = min(INT_MAX, 4) = 4。 - 尝试收缩窗口:将
nums[left] = 2从sum中减去,sum = 8 - 2 = 6,然后left向右移动一格,left = 1。
第五步:right = 3,left = 1
- 此时
sum = 6 < target,不满足条件,继续扩展窗口。
第六步:right = 4
- 将
nums[4] = 4加到sum中,sum = 6 + 4 = 10。 sum >= target,窗口满足条件,计算当前窗口长度right - left + 1 = 4 - 1 + 1 = 4。min_length保持不变,因为已经是 4。- 尝试收缩窗口:将
nums[left] = 3从sum中减去,sum = 10 - 3 = 7,left右移一格,left = 2。
第七步:right = 4,left = 2
sum >= target,继续满足条件,计算当前窗口长度right - left + 1 = 4 - 2 + 1 = 3。- 更新
min_length = min(4, 3) = 3。 - 尝试收缩窗口:将
nums[left] = 1从sum中减去,sum = 7 - 1 = 6,left右移一格,left = 3。
第八步:right = 4,left = 3
- 此时
sum = 6 < target,窗口不满足条件,继续扩展窗口。
第九步:right = 5
- 将
nums[5] = 3加到sum中,sum = 6 + 3 = 9。 sum >= target,窗口满足条件,计算当前窗口长度right - left + 1 = 5 - 3 + 1 = 3。min_length保持不变,因为已经是 3。- 尝试收缩窗口:将
nums[left] = 2从sum中减去,sum = 9 - 2 = 7,left右移一格,left = 4。
第十步:right = 5,left = 4
sum >= target,继续满足条件,计算当前窗口长度right - left + 1 = 5 - 4 + 1 = 2。- 更新
min_length = min(3, 2) = 2。 - 尝试收缩窗口:将
nums[left] = 4从sum中减去,sum = 7 - 4 = 3,left右移一格,left = 5。
遍历完成
最后得到 min_length = 2,即满足条件的最短子数组长度为 2(子数组 [4, 3] 满足条件)。
相关文章:
长度最小的子数组(滑动窗口)
给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1: 输入…...
构建灵活、高效的HTTP/1.1应用:探索h11库
文章目录 构建灵活、高效的HTTP/1.1应用:探索h11库背景这个库是什么?如何安装这个库?库函数使用方法使用场景常见的Bug及解决方案总结 构建灵活、高效的HTTP/1.1应用:探索h11库 背景 在现代网络应用中,HTTP协议是基础…...
大学英语救星!GPT助你完美解答完型填空和阅读理解
文章目录 零、前言一、再来十篇完型填空和阅读理解操作指导拍照:完型填空拍照:阅读理解 二、感受 零、前言 学习过程中,总是会遇到一些问题,但不好意思总是去麻烦问老师或同学 gpt可以帮社恐的你,解决学习问题&#…...
【linux】centos编译安装openssl1.1.1
文章目录 背景用途编译安装openssl1.1.1d测试centos的python2 ssl模块是否正常pyenv编译python3.10需要配置环境变量(必须)编译python前记得安装依赖 背景 首先, centos7 通过yum安装的openssl-devel包是1.0.2k的,这玩意儿太老了。我们选择从源码安装op…...
SpringBoot环境下的学生请假管理平台开发
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
基于Transformer的路径规划 - 第五篇 GPT生成策略_解码方法优化
上一篇:基于Transformer的路径规划 - 第四篇 GPT模型优化 在上一篇中,我尝试优化GPT路径生成模型,但没有成功。在随机生成的测试集上,路径规划成功率只有99%左右。而使用传统的路径规划算法,例如A*,路径规划…...
项目模块十三:Util模块
一、项目设计思路 用于之后协议使用的工具类 二、静态成员函数 1、分割函数 static size_t Split(const string &src, const string &sep, vector<string> *array) string.find(const string &str, size_t pos 0) string.substr(size_t pos 0, size_t…...
10款舞台剧免费音频剪辑软件分享,你用过哪款?
在舞台剧的世界里,音乐是情感的传递者,是气氛的营造者。一个好的舞台剧,离不开精心剪辑的背景音乐。而选择合适的音频剪辑软件,就如同挑选舞台上的演员一样重要。今天,我们就从舞台剧音乐剪辑的角度,来聊聊…...
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
文章目录 一、Redis数据结构概述1.1 Redis有哪些数据类型1.2 Redis本质是哈希表1.3 Redis的哈希冲突与渐进式rehash1.4 数据结构底层1.4.1 简单动态字符串SDS1.4.2 双向链表(后续已废弃)1.4.3 压缩列表ZipList1.4.4 哈希表HashTable1.4.5 跳表SkipList1.…...
496.下一个更大元素Ⅰ
老样子,题目:496. 下一个更大元素 I - 力扣(LeetCode) 题解:代码随想录 AC代码: class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {Stack<Integer> stacknew Stack&l…...
C++类和对象上
1. 类的定义 1.1 类定义格式 • class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。…...
《图像边缘检测算法综述》
在当今的数字时代,图像处理技术在各个领域都发挥着至关重要的作用。其中,边缘检测作为图像处理中的一个关键任务,旨在识别图像中亮度变化显著的区域,进而提取出物体的轮廓和形状。边缘检测不仅是图像处理的基础技术,还…...
Git 使用指南:从基础到实战
Git 是目前最流行的分布式版本控制系统,广泛应用于软件开发、项目协作和版本管理。本文详细介绍 Git 的基础操作、工作流程、分支管理、常见问题解决方法以及进阶技巧,帮助开发者在日常工作中高效地使用 Git。 目录 一、Git 基础概念1.1 版本控制1.2 Git…...
新生代对象垃圾回收如何避免全堆扫描
新生代垃圾回收如何避免全堆扫描:通过卡表 写屏障避免全堆扫描 卡表: 在做YGC的时候,需要判断年轻代里面的对象哪些是垃圾,这些对象可能被老年代的对象引用, 这时候判断年轻代的某个对象是不是垃圾的时候࿰…...
[论文阅读] | 智能体长期记忆
更新记录: 2024.11.2 人大高瓴长期记忆综述 文章目录 人大高瓴长期记忆综述智能体与环境交互记忆的来源/形式/操作来源:(1)当前任务历史信息 (2)其他任务的信息 (3)外部知识形式:如何表达记忆的内容,通过(1)文本 (2)参数(训练到模…...
Vue2.0 通过vue-pdf-signature@4.2.7和pdfjs-dist@2.5.207实现PDF预览
1.安装依赖 npm install pdfjs-dist2.5.207 --savenpm install vue-pdf-signature4.2.7 --save2.在.vue文件中 script 部分引入 <script> import * as PDFJS from pdfjs-dist PDFJS.GlobalWorkerOptions.workerSrc require(pdfjs-dist/build/pdf.worker.js);//解决pdf…...
gradle的安装及其配置
1、下载网址 Gradle | Releases 2、 3、配置环境变量 4、 5、cmd输入gradle-v查看版本...
qt QImage详解
1、概述 QImage是Qt框架中用于处理图像数据的一个核心类。与QPixmap不同,QImage是在内存中直接存储图像像素数据的,这使得它适用于需要直接访问和修改像素的应用场景,比如图像处理算法、图像绘制以及图像分析等。QImage支持多种图像格式&…...
数据分析与效果评估的有效方法与实践探讨
内容概要 在现代社会中,数据分析与效果评估已成为各类项目管理和决策制定中的重要组成部分。首先,数据分析为我们提供了一种系统化的方法,以深入了解所收集数据的内涵与趋势。通过对数据进行整理、分类和分析,我们能够发现潜在的…...
Langchain调用模型使用FAISS
1.导包 from langchain_community.document_loaders import TextLoader from langchain_community.vectorstores import FAISS from langchain_openai.embeddings import OpenAIEmbeddings from langchain_text_splitters import RecursiveCharacterTextSplitter2.加载数据 l…...
【第四周】论文精读:Frustratingly Simple Retrieval Improves Challenging, Reasoning-Intensive Benchmarks
极简检索即可大幅刷新高难度推理基准主流观点认为简单RAG无法提升MMLU、MATH、GPQA等高难度推理任务,甚至会损害性能;本文推翻这一共识,证明核心瓶颈并非检索范式,而是缺少高质量、广覆盖、可单机部署的检索库;提出COM…...
连续使用 OpenClaw 50 天后,我总结了 3 个核心工作流和 5 个血泪教训
🔥 连续使用 OpenClaw 50 天后,我总结了 3 个核心工作流和 5 个血泪教训AI 不会取代你,但会用 AI 的人会取代你——这句话说烂了,但 50 天后我才真正明白它的意思。01 上周五下午 5 点,同事都在加班,我先走…...
3种高效策略:Legacy iOS Kit 旧设备系统降级与越狱终极方案
3种高效策略:Legacy iOS Kit 旧设备系统降级与越狱终极方案 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit L…...
Unity游戏模组革命:MelonLoader新手10分钟完全指南
Unity游戏模组革命:MelonLoader新手10分钟完全指南 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader 你是否想过为喜爱…...
HexView脚本进阶:巧用/CR参数实现多区域数据‘挖空’,为自动化测试铺路
HexView脚本进阶:巧用/CR参数实现多区域数据‘挖空’,为自动化测试铺路 在自动化测试领域,二进制文件的预处理往往决定了测试的深度和效率。想象一下这样的场景:你手头有一份完整的ECU固件文件,但为了验证设备在数据损…...
CLIP-GmP-ViT-L-14开源模型部署指南:HuggingFace Transformers无缝集成方案
CLIP-GmP-ViT-L-14开源模型部署指南:HuggingFace Transformers无缝集成方案 想快速验证一张图片和几段文字描述哪个最匹配吗?手动写代码调用模型、处理数据、计算相似度,是不是想想就觉得麻烦?今天给大家介绍一个开箱即用的工具&…...
Qwen3-VL-4B Pro开箱体验:基于4B进阶模型,视觉理解与推理能力实测
Qwen3-VL-4B Pro开箱体验:基于4B进阶模型,视觉理解与推理能力实测 1. 项目概览:从2B到4B的视觉理解跃迁 Qwen3-VL-4B Pro是基于阿里通义千问Qwen/Qwen3-VL-4B-Instruct模型构建的视觉语言交互服务。相比广为人知的2B轻量版,这个…...
保姆级教程:在Ubuntu 24.04上配置Ollama服务并开机自启(附systemctl管理命令)
在Ubuntu 24.04上构建企业级Ollama服务:从零到生产环境部署指南 当大型语言模型(LLM)从开发环境走向生产部署时,稳定性与可维护性成为首要考量。本文将带您完成Ollama服务在Ubuntu 24.04上的全生命周期配置,涵盖服务架…...
【蛋糕层数组合数量】2024-8-4
缘由求解这一道c问题_编程语言-CSDN问答 很简单,最小数是1,最大数分别乘以比例即得一个数循环乘以比例直到1,那么,有几个数就有多少规律的结合就是数量。 荔枝分析:5可得3 2 1则5、53、52、51、532、531、521、5321。…...
为什么你的Jenkins构建结果不可靠?可能是工作区没清理!
为什么你的Jenkins构建结果不可靠?可能是工作区没清理! 在持续集成(CI)的实践中,Jenkins作为自动化构建的核心工具,其稳定性直接影响着开发团队的交付效率。然而,许多开发者都曾遇到过这样的困惑…...
