算法入门:专题二---滑动窗口(长度最小的子数组)类型题目攻克!

本文涉及的产品
多模态交互后付费免费试用,全链路、全Agent
简介: 给定一个正整数数组和目标值target,找出总和大于等于target的最短连续子数组长度。利用滑动窗口(双指针)优化,维护窗口内元素和,通过单调性避免重复枚举,时间复杂度O(n)。当窗口和满足条件时收缩左边界,更新最小长度,最终返回结果。

长度最小的子数组

长度最小的子数组
image.png

  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. 什么是滑动窗口

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

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

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

  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. 将思路转换为代码!

    题目中要求我们要最终返回最小子数组的长度,而且数组中加起来的和要大于或者等于target,所以先来定义一个sum,初始化为0,接着定义lenINT_MAX,也就是整型中的最大值,在后续更新的时候将len更新为每一次对应的符合要求的数组长度。

    然后定义rightleft,用不回退的双指针滑动窗口来解决这个问题,首先,leftright的位置都指向索引为0的位置,其次,由于是right在不断向后移动,更新right,所以right<n,right++;

    这里就进入了窗口,sum+=nums[right];接着进行判断是否此时的sum>=target,更新len的长度,不满足要求就一直让right加,直到sum>=target,此时len已经满足要求了,right如果不断++,此时会统计出来了所有left在索引为0,right移动小于n这段变化的区间里面满足sum>=target的值。但是由于right++时要判断,有没有继续往后走的必要性。当第一次满足了要求,再往后走就没有必要了。

    len=min(len,right-left+1),取到这段区间中的len最小值。

    然后要更新一下sum此时出窗口,left++,让sum-=nums[left],此时sum一定会小于target,不满足循环条件,跳出循环。再进行right++操作,如果目前的len小于之前的len就更新一下,否则不做改变,最后循环走完之后就会找到最小的len ,此时返回len,还要做一个判断,如果len此时的len找到最小的值了吗是否 符合sum>=taregt的规则,如果没有返回0,如果找到了就返回正确的len ,也就是我们更新出来的。return len==INT_MAX?0:len;

4. 上代码!

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;
    }
};
相关文章
|
1月前
|
存储 算法
算法入门:专题一:双指针(有效三角形的个数)
给定一个数组,找出能组成三角形的三元组个数。利用“两边之和大于第三边”的性质,先排序,再用双指针优化。固定最大边,左右指针从区间两端向内移动,若两短边之和大于最长边,则中间所有组合均有效,时间复杂度由暴力的O(n³)降至O(n²)。
|
1月前
|
存储 算法 编译器
算法入门:剑指offer改编题目:查找总价格为目标值的两个商品
给定递增数组和目标值target,找出两数之和等于target的两个数字。利用双指针法,left从头、right从尾向中间逼近,根据和与target的大小关系调整指针,时间复杂度O(n),空间复杂度O(1)。找不到时返回{-1,-1}。
|
2月前
|
算法 安全 机器人
【路径规划】基于遗传算法结合粒子群算法求解机器人在复杂不同类型下的路径规划研究(Matlab代码实现)
【路径规划】基于遗传算法结合粒子群算法求解机器人在复杂不同类型下的路径规划研究(Matlab代码实现)
|
4月前
|
机器学习/深度学习 数据采集 算法
你天天听“数据挖掘”,可它到底在“挖”啥?——数据挖掘算法入门扫盲篇
你天天听“数据挖掘”,可它到底在“挖”啥?——数据挖掘算法入门扫盲篇
76 0
|
5月前
|
存储 机器学习/深度学习 监控
公司电脑上网监控中滑动窗口算法的理论构建与工程实现
本文提出一种基于滑动窗口算法的实时网络流量监控框架,旨在强化企业信息安全防护体系。系统采用分层架构设计,包含数据采集、处理与分析决策三大模块,通过 Java 实现核心功能。利用滑动窗口技术动态分析流量模式,结合阈值检测与机器学习模型识别异常行为。实验表明,该方案在保证高检测准确率的同时支持大规模并发处理,为企业数字化转型提供可靠保障。
113 0
|
27天前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
92 2
|
2月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
161 3
|
17天前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
|
17天前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
100 8
|
17天前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)

热门文章

最新文章