【数组】长度最小的子数组(滑动窗口解法)

思路:(正确,但空间和时间复杂度太高)

int minSubArrayLen(int target, int* nums, int numsSize){
    int temp = 0;
    int ret = 0;
    int sum = 0;
    int i = 0;
    int j = 0;

    for(i = 0; i < numsSize; i++) {
        temp = 0;
        sum = 0;
        for(j = i; j < numsSize; j++) {
            sum += nums[j];
            temp++;
            if(sum >= target)
                if(ret > temp || ret == 0)
                    ret = temp;
        }
        if(j==numsSize-1 && sum < target)
            return 0;
    }
    return ret;
}

官方思路:(滑动窗口)

  1. 设置指针left和right,都指向第一位元素
  2. 用right指针循环数组,每次循环都使sum+=nums[right]
  3. 判断nums是否≥target:
    1. 如果是,记录此时子数组长度。将nums[left]从sum中减去,left指针右移。判断sum还是否≥target
    2. 如果否,right指针继续右移
int minSubArrayLen(int target, int* nums, int numsSize){
    int length = MAXLENGTH;
    int sum = 0;
    int left = 0; //左指针
    int right = 0; //右指针
    int subLength = 0;

    for(right = 0; right < numsSize; right++) {
        sum+=nums[right];
        //若sum>=target,则将left位数据从sum中减去,看看sum是否还大于等于target。若不是,则for循环继续
        while(sum >= target) {
            subLength = right - left+1;
            length = length < subLength ? length : subLength;
            sum-=nums[left++]; //判断从sum中减去left指针位sum还是否大于等于target
        }
    }
    return length == MAXLENGTH ? 0 : length;
}