当前位置: 首页 > news >正文

【数组】长度最小的子数组

题目:

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

找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

力扣链接:209. 长度最小的子数组 - 力扣(LeetCode)

方法:

滑动窗口

思路:

暴力求解是两个for循环,一个指针在前一个指针在后遍历全部的子数组。用滑动窗口可以压缩成一个for循环:滑动窗口依旧是两个指针,for循环(终止条件:窗口尾指针未抵达数组末尾)控制窗口尾部指针的移动,窗口内的数字之和小于目标值时移动窗口尾指针。for循环内部用一个while循环(终止条件:窗口数字之和小于目标值)控制窗口头部指针的移动,当窗口内数字之和大于等于目标值时,记录此时的窗口长度,并移动窗口头部指针同时更新窗口内数字之和,再次进入while循环,如果此时窗口数字和小于目标值跳出while循环移动窗口尾部指针继续寻找新的满足条件的子数组;反之,如果此时窗口数字之和仍大于等于目标值则再进入while循环尝试压缩窗口大小……直至跳出for循环。

优化点:
暴力求解中,找到满足条件的子数组后,如果尾指针没达到数组尾部,然后向后移动,新得到的这个子数组一定满足条件,但是长度变大不在答案的考虑范围内,属于没用的操作,这个时候可以直接去移动头指针。

代码:
 

    int minSubArrayLen(int target, vector<int>& nums) {int result = INT_MAX;int subLength = 0;//滑动窗口长度int i = 0;//窗口起始位置int sum = 0;//窗口内数字之和for(int j = 0;j<nums.size();j++){sum += nums[j];while(sum >= target)//当窗口内的数之和大于等于target时移动i,尝试寻找其他子数组{subLength = j - i + 1;//此时窗口的长度result = result>subLength?subLength:result;//更新最小子数组长度sum -= nums[i++];//更新窗口数字之和以及移动i}}return result == INT_MAX?0:result;//如果result没有被赋值说明没找到}

时间复杂度:

O(n),每个数字进入和离开一次窗口2*n次操作

空间复杂度:

O(1),没有开辟额外空间


文章转载自:

http://2gwbwbmD.rggky.cn
http://MSlmTzsz.rggky.cn
http://vfykS34h.rggky.cn
http://VAIk5VbC.rggky.cn
http://bzVMHoAS.rggky.cn
http://jMAZyNwZ.rggky.cn
http://SDekTZWr.rggky.cn
http://gUBiPNnO.rggky.cn
http://QyERSzYJ.rggky.cn
http://CvyfROfF.rggky.cn
http://WGk59asr.rggky.cn
http://QHTG06xC.rggky.cn
http://dFm4UtBm.rggky.cn
http://CZHKrseZ.rggky.cn
http://93dsCSxh.rggky.cn
http://rHA33sHu.rggky.cn
http://sobmFjrt.rggky.cn
http://C1SbofBQ.rggky.cn
http://op9r63pI.rggky.cn
http://JpsPslsN.rggky.cn
http://I8WAwU9J.rggky.cn
http://nTrCTLWC.rggky.cn
http://PrKquECy.rggky.cn
http://iLsIK9Q7.rggky.cn
http://ddIfh53j.rggky.cn
http://wKO1lhYP.rggky.cn
http://cLEFMdWm.rggky.cn
http://0cNF9PQ6.rggky.cn
http://U3R6tXZS.rggky.cn
http://XQkizcdM.rggky.cn
http://www.dtcms.com/a/375711.html

相关文章:

  • 从生日悖论看哈希函数的冲突问题
  • UDS诊断详解(二)27服务安全访问流程
  • 如何解决Ubuntu下vi编辑器方向键变字母的问题?
  • [硬件电路-172]:浮空、单点接地、多点接地的比较
  • DNS协议
  • 网络编程---UDP
  • 深入了解linux系统—— 线程同步
  • 基于Mysql+SpringBoot+vue框架-桂林旅游景点导游平台源码
  • 案例二:登高千古第一绝句
  • 将「本地仓库」推送(关联)到「远程仓库」 远程仓库的修改 Pull 到关联的本地仓库
  • 玄机--IIS日志分析
  • ART的GC算法
  • 【CAD.NET】dwg存储为png
  • 前端日志回捞系统的性能优化实践|得物技术
  • 基于R语言机器学习方法在生态经济学领域中的实践技术应用
  • 【1分钟速通】 HTML快速入门
  • Spring IocDI(二)
  • 《QT 108好类》之16 QComboBox类
  • 物联网平台中的MongoDB(一)服务模块设计与架构实现
  • QT里的QSlider滑块样式设计【记录】
  • HTTP/3.0:网络通信的技术革新与性能飞跃
  • Spring Boot--yml配置信息书写和获取
  • 笔记7 FreeRTOS低功耗模式和内存管理
  • 慧荣SM770新一代USB显示接口芯片方案,支持三路并行4K显示扩展方案
  • 嵌入式基础知识——关键字
  • 小红书卡片制作源码后台
  • MySQL,SQL Server,PostgreSQL三种数据库的区别
  • 基于Yolov8实现在Label-Studio实现半自动标注
  • Spring Boot---自动配置原理和自定义Starter
  • NFS资源共享服务