题目描述:

方法1:暴力搜索,两个for循环

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int min = INT_MAX;
        for(int i=0;i<nums.size();i++){
            int sum = nums[i];
            int num = 1;
            if(sum >= target){
                return num;
            }
            for(int j=i+1;j<nums.size();j++){
                sum += nums[j];
                num++;
                if(sum >= target){
                    min = num<min?num:min;
                    break;
                }
            }
        }
        return min<=nums.size()?min:0;
        
    }
};

超时

方法2:双指针实现滑动窗口,找到一个大于等于target的子数组,更新完min后,试着缩小子数组同时不断更新min(从头开始去除元素),小于target后又从尾开始添加元素找到下一个大于等于target的子数组

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int min = INT_MAX;
        int left = 0;
        int sum = 0;
        for(int i=0;i<nums.size();i++){
            sum += nums[i];
            while(sum >= target){
                min = min<(i-left+1)?min:(i-left+1);
                sum -= nums[left];
                left++;
            }
        }
        return min<=nums.size()?min:0;
    }
};