leetcode209. 长度最小的子数组

 
 

双指针滑动窗口解法,时间复杂度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;
    }
};

猜你喜欢

转载自www.cnblogs.com/renzmin/p/11869365.html