力扣209. 长度最小的子数组:
使用双指针算法,速度达到O(n),空间为O(1)
问题描述
题目讲解:
题目要求的是连续最短小于目标数的子数组 ,这就意味着我们可以考虑使用双指针算法来解决问题,我们首先使用i和j两个指针。i指针不断先前移。使用sum记录总和,当总和超越目标值的时候,减去j指针的数值,j指针不断向前移,直到小于目标和。不断跟新ans取i-j+1的最小值。当ans==nums.size()+1时返回0
提示:ans初始值是nums.size()+1,sum初始值为0。
代码:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
long long sum=0;
long long ans=nums.size()+1;
for(long long i=0,j=0;i<nums.size();i++)
{
sum=sum+nums[i];
while(sum>=target)
{
ans=min(ans,i-j+1);
sum=sum-nums[j];
j++;
}
}
if(ans==nums.size()+1)
return 0;
return ans;
}
};