双指针滑动窗口解法,时间复杂度O(N)。
滑动窗口,想象一下,在一个坐标上存在两个指针begin 和i ,begin 代表滑窗的左边框,i代表滑窗的右边框。两者通过分别向右滑动,前者能使窗口之间的和减小,后者能使窗口之间的和增大。开始时二者重合,窗口的和就是重合点所在的数。
开始i向右滑动,使和变大。
当恰好大于等于s时,记录滑窗所包括的子数组长度ans,若ans已有数值,需判断新值是否小于旧值,若是,更新ans。begin向右滑动
判断是否仍大于等于s
若是,重复步骤2,3。若否,转步骤1。直到右边框到达最右边
class Solution { public: int minSubArrayLen(int s, vector<int>& nums) { int left=0;int right=0; int ans=INT_MAX; int sum=0; while(right<nums.size()) { if(nums[right]+sum<s) { sum+=nums[right]; right++; } else { if(right-left+1<ans) ans=right-left+1; sum=sum-nums[left]; left++; } } return (ans<INT_MAX)?ans:0; } };