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

算法入门:专题二---滑动窗口(长度最小的子数组)更新中

🎬 胖咕噜的稞达鸭:个人主页

🔥 个人专栏: 《数据结构》《C++初阶高阶》《算法入门》

⛺️技术的杠杆,撬动整个世界!

在这里插入图片描述

长度最小的子数组

长度最小的子数组
在这里插入图片描述

  1. 题目解析:
    定义一个target目标值,在数组中要找到满足其总和大于等于target的长度最小的子数组,在示例1中,target是7,数组[ 2, 3 1 2 4 3 ],2+3+1+2=8,是连续子数组,而且满足>=7的条件,算一个;3+1+2+4>=7,也算,1+2+4=7,算一个;2+4+3>=7,也算;4+3=7,也算。在这些满足条件的数组中要找到长度最小的,已知是【4,3】,最终要返回最小数组的长度,是2,所以最后返回的是2。

  2. 算法原理:

解法一:

暴力枚举出所有的子数组的和。

暴力枚举策略优化:

题目中强调所有的数字都是正整数,当正整数相加的时候,加的数字越多总共和就会越大,涉及单调性!

先固定一个左区间,枚举右区间
具体做法如下:

[ 2, 3 1 2 4 3 ]给定一个数组,让left指向下标索引为0的位置,然后要定义一个sum用来存储子数组的和,接着还要定义一个right,这个right最开始指向的是下标索引为0的位置,当right向后进行遍历的时候,right指向索引为0的位置,sum=2;right++,sum=2+3=5;此时sum<target;继续遍历,right++,sum=2+3+1=6;此时sum<target;right++,
sum=sum+nums[right]=2+3+1+2=8,此时sum=target,满足条件,由于题目中要求返回的是最小数组的长度,还要定义一个len,用来计算符合条件的数组的长度,此时len=4;当right++,继续走,sum=sum+nums[right]=8+4=12;又是一个满足条件的,len 此时为5.
此时right再次向后++,sum一定是满足大于target的条件,但是len是不断增加的,我们需要的是最小数组的长度,此时就可以停止枚举了。
然后这段区间的left就要更新一下了,left++,然后right需要回退到left的位置吗?
不需要,此时我们已经找到了前一个sum,也就是right在索引为3的位置,此时的sum=8,是第一个大于target的数组的和,right不用回退,我们只需要用第一个满足条件的sum长度减去num[left-1],然后接着判断此时的sum是否大于target,sum=sum(之前的)-num[left-1]=6,小于target,right++,sum=sum+num[right]=6+4=10,满足条件,大于target;len=4;
此时left++;继续进行枚举。

解法二:

利用单调性,使用同向双指针来优化。(同向双指针也就是滑动窗口)

  1. 什么是滑动窗口

本质上就是同向双指针,在遍历数组的时候会做到,就像一个窗口在数组中从左到右滑动。

  1. 什么时候用滑动窗口?

在暴力解法的时候,两个指针都可以不回退,就可以用滑动窗口。

  1. 那么怎么用滑动窗口呢?

1.先初始化Left和right让他们来标记左区间和右区间。
2.进窗口
3.判断是否该出窗口,还要更新一下结果(这一步需要旧题论题)。

定义完left和的时候,就让right移动到一个符合条件的最佳位置。定义一个sum来维护窗口,sum增加的时候要判断是否大于target,是否满足条件,如果满足条件,此时需要更新一下结果,len 的长度要更新一下,让left向右移动一位数字,此时left已经出了窗口,然后sum=sum-num[left],len-1,再接着进行判断,此时的sum小于target,right++,一直进行四步操作。直到right指向为空。

  1. 怎么保证正确性
    利用了单调性,规避了很多没有必要的枚举行为,当sum第一次>=target的时候,right再次向后走,此时的sum一定是满足大于target的条件,但是len是不断增加的,我们需要的是最小数组的长度,此时就可以停止枚举了。
  2. 最终的时间复杂度是O(N)

3. 上代码!

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n=nums.size(),sum=0,len=INT_MAX;for(int left=0,right=0;right<n;right++){sum+=nums[right];//进窗口while(sum>=target)//判断{len=min(len,right-left+1);//更新结果sum-=nums[left++];//出窗口}}return len==INT_MAX?0:len;}
};

在这里插入图片描述

http://www.dtcms.com/a/485937.html

相关文章:

  • 2025年存储市场报告深度解读
  • HTTP 413 状态码详解与前端处理,请求体过大
  • 大数据背景下时序数据库选型指南:国产开源技术的突破与实践
  • asp网站优化云南网站制作需求
  • k8s(六)Pod的资源控制器
  • TypeScript前端架构与开发技巧深度解析:从工程化到性能优化的完整实践
  • 郴州做网站网站建设公司ejiew
  • LeetCode 将数组和减半的最少操作次数
  • OpenHarmony南向开发环境搭建 - 深入理解Ubuntu、DevEco Device Tool与HPM
  • QT-day1
  • Spec-Kit+Copilot打造AI规格驱动开发
  • Linux服务器编程实践30-TCP交互数据流:Nagle算法与延迟确认的作用
  • MATLAB一个基于Attention-LSTM的分类模型,构建Attention-LSTM深度学习模型,训练模型并进行分类预测
  • 杭州网站建设朗诵面朝网站建设策划内容
  • 手机网站开发模板南昌网站设计建设
  • Playwright中page的实现类深度解析-PageImpl 方法作用解析
  • 【完整源码+数据集+部署教程】 【运动的&足球】足球场上球检测系统源码&数据集全套:改进yolo11-DGCST
  • 无用知识研究:如何用decltype里的逗号表达式判断一个类里面有operator <号,并在编译时优雅给出提示,而不是一大堆不相干的模板信息
  • 人类知识体系分类
  • Java 大视界 -- Java 大数据在智能政务数字身份认证与数据安全共享中的应用
  • 《Foundation 图标参考手册》
  • 从 “坑“ 到 “通“:Spring AOP 通知执行顺序深度解密
  • 博途SCL语言仿真七段数码管
  • 关于网站建设的介绍本地搭建wordpress建站教程
  • 免费网站收录网站推广苏州网站建设推荐q479185700霸屏
  • 【LeetCode热题100(43/100)】验证二叉搜索树
  • 养殖场疫病预警新方案:小吉快检BL-08plus现场快速锁定病原
  • 【ADS-1】【python基础-3】函数封装与面向对象
  • 攻防世界-Web-baby_web
  • SQLite数据库基本操作