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

Leetcode 209.长度最小的子数组

给定一个含有 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 <= 109
  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 105

思路

暴力枚举除外,想要找出连续并且相加大于target的最短的字串,至少需要两个指针进行遍历,一个在前一个在后。

第一个针对枚举次数的优化,left指针定住,right往右走,每定义sum,每次加等right,大于traget后就可以停止遍历了,因为要找最短,right再往后只会找到更长的,此时单趟遍历结束。

此时可以直接让left右移 sum-=nums[left];再次比较此时子串和是否大于target,因为有可能右移之后依然>=target,此时len还变短了,如果不符合条件再开始下一趟遍历,然后继续找符合要求的字串,找到后和原本的len进行比较,如果比原来的len小就更新比原来大就移动left然后重复上述操作。

此时可以发现,left和right和通常意义下的双指针不同,不是都向内移动,而是同向进行移动,此时,这种方法就叫做同向双指针,也叫做,滑动窗口。 就像一个随时在变的窗口一样,left是窗口左边,right是窗口右边,每次right移动可以比作进窗口,left移动可以比作出窗口。总结一下就以下三步。

代码实现复杂度O(n)

虽然套了两次循环,但时间复杂度可不是O(n^2),因为每次不管是left动还是right动,整个窗口都是在向右移动,不会再出现左移,此时最差的情况也就是right一直走走到结尾然后left一直走走到结尾。

即便如此复杂度依然为2N.

while循环

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int left=0,right=0,len=0;int sum=0;int len1=0;while(left<(nums.size())){if(right<nums.size()) sum+=nums[right];//入窗口else{if(sum<=target) break;//如果right走到结尾此时sum依然小于target直接break,因为窗口值只会越来越小}while(sum>=target)//判断大于target{len1=right-left+1;if(len==0||len1<len)//更新结果{len=len1;}sum-=nums[left++];//出窗口}right++;}return len;}
};

for循环

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int left=0,right=0,len=0;int sum=0;int len1=0;for(int left=0,right=0;right<nums.size();right++){sum+=nums[right];while(sum>=target){len1=right-left+1;if(len1<len||len==0){len=len1;}sum-=nums[left++];}}return len;}
};

相关文章:

  • 第2讲-Memory
  • 一文带你解决如何设置Redis临时密码和永久密码
  • C++内联函数的使用
  • 面试前端性能优化八股文十问十答第三期
  • Python+Requests+Pytest+YAML+Allure实现接口自动化
  • SpringBoot项目嵌入RabbitMQ
  • VSCODE include错误 找不到 stdio.h
  • leetcode-回溯法-矩阵中的路径
  • PostMan使用自带js库base64编码、sha256摘要、环境变量的使用
  • 主流开发语言和开发环境:探索编程世界的基础
  • Linux篇:指令
  • 程序媛的mac修炼手册-- 小白入门Java篇
  • 第八篇【传奇开心果系列】python的文本和语音相互转换库技术点案例示例:Google Text-to-Speech虚拟现实(VR)沉浸式体验经典案例
  • 2024 windows环境下安装RabbitMQ(亲测超详细)
  • springboot213大学生心理健康管理系统的设计与实现
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【347天】每日项目总结系列085(2018.01.18)
  • docker-consul
  • hadoop集群管理系统搭建规划说明
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Kibana配置logstash,报表一体化
  • PAT A1120
  • SegmentFault 2015 Top Rank
  • spark本地环境的搭建到运行第一个spark程序
  • 编写高质量JavaScript代码之并发
  • 从零开始学习部署
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 简单实现一个textarea自适应高度
  • 码农张的Bug人生 - 初来乍到
  • 前端路由实现-history
  • 前端设计模式
  • 深入 Nginx 之配置篇
  • 手写双向链表LinkedList的几个常用功能
  • 线性表及其算法(java实现)
  • 鱼骨图 - 如何绘制?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • (23)Linux的软硬连接
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (层次遍历)104. 二叉树的最大深度
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (一一四)第九章编程练习
  • (已解决)什么是vue导航守卫
  • (转)socket Aio demo
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET CORE Aws S3 使用
  • .net MySql
  • .NET 解决重复提交问题
  • .NET6实现破解Modbus poll点表配置文件
  • .Net程序帮助文档制作
  • .NET国产化改造探索(一)、VMware安装银河麒麟