第一种:最能想到的就是两个for循环,i为起始点,j依次遍历i后面的数,符合条件跳出内层循环,i移动一个又重复上面的步骤 。但这样效率有点低。
第二种(从代码随想录那里学习到的):滑动窗口,j是终止位置,遍历整个数组,动态改变i起始的位置。当每次由i和j组成的窗口大了的时候即该窗口的和大于目标值,就需要缩小窗口,即移动i的值让i++,但要sum减掉之前nums[i]的值
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int sum=0;
int i=0;
int k=INT_MAX;
for(int j=0;j<nums.size();j++)
{
sum+=nums[j];
while(sum>=target)
{
int result=j-i+1;//数组下标求长度
k=k<result?k:result;
sum-=nums[i++];
}
}
return k==INT_MAX?0:k;
}
};