长度最小的子数组--滑动窗口
暴力法
两个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;}
};
长度最小的子数组--滑动窗口相关推荐
- [Leedcode][JAVA][第209题][长度最小的子数组][滑动窗口][前缀和][二分查找][双指针]
[问题描述][中等] 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度.如果不存在符合条件的连续子数组,返回 0.示例: 输入: ...
- leet209. 长度最小的子数组 滑动窗口
题目: 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度.如果不存在符合条件的子数组,返回 0. 示例: 输入:s = 7, ...
- leetcode209. 长度最小的子数组(滑动窗口)
一:题目 二:上码 class Solution {public:/**思路:1.滑动窗口解法1>:确定窗口内是什么2>:确定窗口的起始位置3>:确定窗口的终止位置2.窗口:也就是我 ...
- LeetCode 209. 长度最小的子数组 (滑动窗口)
LeetCode 209. 长度最小的子数组 class Solution {public int minSubArrayLen(int s, int[] nums) {int start = 0;i ...
- 209. 长度最小的子数组(中等 数组 滑动窗口)
209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, -, n ...
- 长度最小的子数组(力扣209)
长度最小的子数组(力扣209) 给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, -, ...
- 代码随想录算法训练营第二天|LeetCode 977.有序数组的平方 、209.长度最小的子数组 、59.螺旋矩阵II
LeetCode 977.有序数组的平方 题目链接:977.有序数组的平方 思路: 1.先对每个数进行遍历平方,并插入新的容器中 2.对容器进行排序,返回就可以了 缺陷:开辟了新的容器空间 class ...
- 代码随想录算法训练营第二天|T977(有序数组的平方)、T209(长度最小的子数组)、T58(螺旋矩阵Ⅱ)
代码随想录刷题2022.02.02 双指针法 LeetCode题目: T977(有序数组的平方) 解题要点 定义好指针变量,在循环语句中认清充当指针的变量的移动过程 注意:1)一次性定义多个变量时,只 ...
- 卷进大厂系列之LeetCode刷题笔记:长度最小的子数组(中等)
学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl ...
最新文章
- Uncaught ReferenceError: angular is not defined
- 什么是进程什么是线程,他们的区别是什么
- [RHEL5企业级Linux服务攻略]--第9季 Squid服务全攻略之高级配置
- 安全实现Linux网络监控(1)
- visual studio code配置项
- python第三天习题
- linux内核编译的image,内核编译时生成uImage的办法
- 手把手教你搭建数据库服务器平台 | DBA VS 自动化运维,究竟谁与争锋?
- exists sql用法_《SQL进阶教程》笔记(3)
- Linux 引导流程解析
- Windows XP sp3上可以安装SQL Server 2008企业版?
- 计算机应用基础第一章ppt,计算机应用基础第一章课件.ppt
- windows命令行测试硬盘速度
- MongoDB Could not find host matching read preference { mode: \primary\ } for set repl_shard1
- Linux和git起步
- FPGA音频录音,WM8731音频采集存储DDR3,基于米联客FDMA实现
- [zt]师太,你就从了老衲吧(完整版本)
- 【AI视野·今日CV 计算机视觉论文速览 第235期】Mon, 27 Sep 2021
- ICLR 2020|PairNorm: Tackling Oversmoothing in GNNs
- Ubuntu菜鸟入门(七)—— 微信安装
热门文章
- Java Class Loader Retrospect
- [基础题] 7.第二种(*)按如下要求编写Java程序:
- oracle表格颜色,如何在oracle中使用光标更新特定颜色
- C# 系统应用之ListView实现简单图片浏览器
- 【数据结构与算法】之深入解析“平衡二叉树”的求解思路与算法示例
- RxSwift之订阅UITableViewCell里的按钮点击事件
- 以下关于单模光纤的说法中,正确的是( )
- Vue+G2:Please specify the container for the chart! + Cannot read property ‘appendChild‘ of null
- 传阿里旗下蚂蚁集团拟上市集资300亿美元,最快9月IPO
- 买房子,就该用线性回归