题目
题解
当需要查找数组中某些连续的数字之和,适合使用滑动窗口
先将滑动窗口的长度设置为0,先将左侧固定,右边界向右移动,同时计算需要找的条件,直到找到可行解为止
当找到可行解后,对其进行优化,本题优化方式为将左边界向右移动,使滑动窗口内的数字个数减小,直到不符合条件为止
最后,将优化后的最优解返回,作为结果返回
代码
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
//先判断数组长度
int numSize=nums.size();
if(numSize==0) //如果数组长度为0,不用判断target值,直接返回0即可
{
return 0;
}
int resMin=INT_MAX;
//先设最短数组长度为最大值,最后根据minSize是否为INT_MAX判断最终长度
int left=0; //左边界为0
int right=0; //右边界为0
//滑动窗口此时长度为0
int sum=0; //滑动窗口内的值之和
while(right<numSize) //右边界向右移动,直到到达数组的右边界
{
sum=sum+nums[right]; //计算滑动窗口内的值之和
while(sum>=target) //当窗口中的值大于等于目标值,符合条件时,证明找到可行解,接下来对可行解进行优化
{
int subLen=right-left+1; //计算滑动窗口长度
if(subLen<resMin) //如果可行解的长度小于解的初始值,更新设定值
{
resMin=subLen; //将目前最优解更新
}
sum=sum-nums[left++]; //如果有符合条件的可行解,则将滑动窗口左侧向右移再看
}
right++;
}
return resMin==INT_MAX?0:resMin;
}
};