[{"createTime":1735734952000,"id":1,"img":"hwy_ms_500_252.jpeg","link":"https://activity.huaweicloud.com/cps.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=201905","name":"华为云秒杀","status":9,"txt":"华为云38元秒杀","type":1,"updateTime":1735747411000,"userId":3},{"createTime":1736173885000,"id":2,"img":"txy_480_300.png","link":"https://cloud.tencent.com/act/cps/redirect?redirect=1077&cps_key=edb15096bfff75effaaa8c8bb66138bd&from=console","name":"腾讯云秒杀","status":9,"txt":"腾讯云限量秒杀","type":1,"updateTime":1736173885000,"userId":3},{"createTime":1736177492000,"id":3,"img":"aly_251_140.png","link":"https://www.aliyun.com/minisite/goods?userCode=pwp8kmv3","memo":"","name":"阿里云","status":9,"txt":"阿里云2折起","type":1,"updateTime":1736177492000,"userId":3},{"createTime":1735660800000,"id":4,"img":"vultr_560_300.png","link":"https://www.vultr.com/?ref=9603742-8H","name":"Vultr","status":9,"txt":"Vultr送$100","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":5,"img":"jdy_663_320.jpg","link":"https://3.cn/2ay1-e5t","name":"京东云","status":9,"txt":"京东云特惠专区","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":6,"img":"new_ads.png","link":"https://www.iodraw.com/ads","name":"发布广告","status":9,"txt":"发布广告","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":7,"img":"yun_910_50.png","link":"https://activity.huaweicloud.com/discount_area_v5/index.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=aXhpYW95YW5nOA===&utm_medium=cps&utm_campaign=201905","name":"底部","status":9,"txt":"高性能云服务器2折起","type":2,"updateTime":1735660800000,"userId":3}]
此题用到的方法是滑动窗口(唬人叫法)
但其实滑动窗口并不难,本质上还是双指针,只不过换了一个马甲而已,我们定义一个fast指针,一个slow指针,不断的计算从slow指针到fast指针之间的值
我们以力扣给出的示例作解释
我们令fast指针 =0;令slow指针=0
再定义一个计算 从slow指针到fast指针的总和的 int变量sum
以及用来统计符合要求的连续子数组长度的count变量
此时sum的值=2,小于target值 ,我们就移动fast指针来扩大sum的值。
此时sum的值=5,小于target的值,继续移动fast指针来扩大sum的值,依次类推,我们发现当fast指向第四个元素
2 的时候,下标值等于7,记录此时的数组长度count
此时我们再次移动fast指针
此时我们发现sum的值已经大于7了,那么这个时候我们就移动slow指针向前
此时sum的值仍然大于7,我们就继续移动slow指针
我们发现此次sum的值又符合条件,就判断此时的数组长度是否小于之前的count,如果小于就更新count的值。
依次类推,终止条件为slow指针指向最后一个数组元素的时候。我们就能够遍历完整个数组,找出所有满足我们sum等于target的连续子数组。
这个题的思路为利用动态窗口统计出所有符合要求的连续子数组,获取他的长度(我们这里的方法是fast指针-slow指针+1
),然后不断与之前的count值进行比较,如果小于就更新,最终遍历结束之后返回count就可以了
以下为该题的实现
int minSubArrayLen(int target, int* nums, int numsSize){
//暴力写法会超时,因此我们学习滑动窗口写法,本质上还是双指针。
int fast=0;
int slow=0;
int min=1000000;//用来存储更新之后的最小长度
int sum=0;
while(fast<numsSize)
{
sum=sum+nums[fast];
while(sum>=target)
{
int count=fast-slow+1;//计算当前长度
if(min>count)
{
min=count;
}
sum-=nums[left++];
}
fast++;
}
if(min==1000000)//如果没有满足条件的子字符串
{
return 0;
}
return min;
}
总结:
1.动态窗口可以实现快速的处理连续的数据。
2.动态窗口有两种:
1.长度变换的动态窗口,也就是我们这种。
2.长度不变换的动态窗口。
3.什么情况可以用滑动窗口来解决实际问题呢?
* 一般给出的数据结构是数组或者字符串
* 求取某个子串或者子序列最长最短等最值问题或者求某个目标值时
* 该问题本身可以通过暴力求解
结束!