暴力法

两个for循环,然后不断的寻找符合条件的子序列,时间复杂度很明显是O(n^2) 。

时间复杂度:O(n^2)
空间复杂度:O(1)
class Solution {public:int minSubArrayLen(int target, vector<int>& nums) {int result=INT32_MAX;//最终结果。要返回长度最小长度,起始设置为最大,等待更新int sum;   //用来计算子序列的数值之和int sublen;//用来记录子序列的长度int size=nums.size();for(int ii=0;ii<size;ii++){// 设置子序列起点为iisum=0;for(int jj=ii;jj<size;jj++){ // 设置子序列终止位置为jjsum+=nums[jj];if(sum>=target){// 一旦发现子序列和超过了target,更新resultsublen=jj-ii+1;// 计算子序列的长度result=result<sublen ? result:sublen;break;// 因为我们是找符合条件最短的子序列,所以一旦符合条件就break}}}// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列return result==INT32_MAX? 0:result;}
};

滑动窗口

所谓滑动窗口,「就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果」。

其实从动画中可以发现滑动窗口也可以理解为双指针法的一种!只不过这种解法更像是一个窗口的移动,所以叫做滑动窗口更适合一些。

在本题中实现滑动窗口,主要确定如下三点:

窗口内是什么?
如何移动窗口的起始位置?
如何移动窗口的结束位置?

窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。

窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。

窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,窗口的起始位置设置为数组的起始位置就可以了。

解题的关键在于 窗口的起始位置如何移动,如图所示:

可以发现「滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)的暴力解法降为O(n)。

class Solution{public:int minSubArrayLen(int target,vector<int>& nums){int result=INT32_MAX;int sum=0;   // 滑动窗口数值之和int sublen=0;// 滑动窗口的长度int ileft=0;//滑动窗口起始位置int size=nums.size();//滑动窗口结束位置其实就是遍历数组的指针for(int iright=0;iright<size;iright++){sum+=nums[iright];while(sum>=target){sublen=iright-ileft+1;result=result<sublen? result:sublen;//双指针暴力解法中是跳出第二层循环到第一层循环刷新sum=0,然后移动子序列起点,在进入第二层循环重新计算sum//此处滑动窗口,直接改变滑动窗口起始位置,不必将sum归零重新计算,只是把起始位置值删去即可sum-=nums[ileft++];// 这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置)}} return result==INT32_MAX? 0:result;}
};

长度最小的子数组--滑动窗口相关推荐

  1. [Leedcode][JAVA][第209题][长度最小的子数组][滑动窗口][前缀和][二分查找][双指针]

    [问题描述][中等] 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度.如果不存在符合条件的连续子数组,返回 0.示例: 输入: ...

  2. leet209. 长度最小的子数组 滑动窗口

    题目: 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度.如果不存在符合条件的子数组,返回 0. 示例: 输入:s = 7, ...

  3. leetcode209. 长度最小的子数组(滑动窗口)

    一:题目 二:上码 class Solution {public:/**思路:1.滑动窗口解法1>:确定窗口内是什么2>:确定窗口的起始位置3>:确定窗口的终止位置2.窗口:也就是我 ...

  4. LeetCode 209. 长度最小的子数组 (滑动窗口)

    LeetCode 209. 长度最小的子数组 class Solution {public int minSubArrayLen(int s, int[] nums) {int start = 0;i ...

  5. 209. 长度最小的子数组(中等 数组 滑动窗口)

    209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, -, n ...

  6. 长度最小的子数组(力扣209)

    长度最小的子数组(力扣209) 给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, -, ...

  7. 代码随想录算法训练营第二天|LeetCode 977.有序数组的平方 、209.长度最小的子数组 、59.螺旋矩阵II

    LeetCode 977.有序数组的平方 题目链接:977.有序数组的平方 思路: 1.先对每个数进行遍历平方,并插入新的容器中 2.对容器进行排序,返回就可以了 缺陷:开辟了新的容器空间 class ...

  8. 代码随想录算法训练营第二天|T977(有序数组的平方)、T209(长度最小的子数组)、T58(螺旋矩阵Ⅱ)

    代码随想录刷题2022.02.02 双指针法 LeetCode题目: T977(有序数组的平方) 解题要点 定义好指针变量,在循环语句中认清充当指针的变量的移动过程 注意:1)一次性定义多个变量时,只 ...

  9. 卷进大厂系列之LeetCode刷题笔记:长度最小的子数组(中等)

    学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl ...

最新文章

  1. Uncaught ReferenceError: angular is not defined
  2. 什么是进程什么是线程,他们的区别是什么
  3. [RHEL5企业级Linux服务攻略]--第9季 Squid服务全攻略之高级配置
  4. 安全实现Linux网络监控(1)
  5. visual studio code配置项
  6. python第三天习题
  7. linux内核编译的image,内核编译时生成uImage的办法
  8. 手把手教你搭建数据库服务器平台 | DBA VS 自动化运维,究竟谁与争锋?
  9. exists sql用法_《SQL进阶教程》笔记(3)
  10. Linux 引导流程解析
  11. Windows XP sp3上可以安装SQL Server 2008企业版?
  12. 计算机应用基础第一章ppt,计算机应用基础第一章课件.ppt
  13. windows命令行测试硬盘速度
  14. MongoDB Could not find host matching read preference { mode: \primary\ } for set repl_shard1
  15. Linux和git起步
  16. FPGA音频录音,WM8731音频采集存储DDR3,基于米联客FDMA实现
  17. [zt]师太,你就从了老衲吧(完整版本)
  18. 【AI视野·今日CV 计算机视觉论文速览 第235期】Mon, 27 Sep 2021
  19. ICLR 2020|PairNorm: Tackling Oversmoothing in GNNs
  20. Ubuntu菜鸟入门(七)—— 微信安装

热门文章

  1. Java Class Loader Retrospect
  2. [基础题] 7.第二种(*)按如下要求编写Java程序:
  3. oracle表格颜色,如何在oracle中使用光标更新特定颜色
  4. C# 系统应用之ListView实现简单图片浏览器
  5. 【数据结构与算法】之深入解析“平衡二叉树”的求解思路与算法示例
  6. RxSwift之订阅UITableViewCell里的按钮点击事件
  7. 以下关于单模光纤的说法中,正确的是( )
  8. Vue+G2:Please specify the container for the chart! + Cannot read property ‘appendChild‘ of null
  9. 传阿里旗下蚂蚁集团拟上市集资300亿美元,最快9月IPO
  10. 买房子,就该用线性回归