目录

LeetCode209长度最小子数组

目录

LeetCode209长度最小子数组

https://i-blog.csdnimg.cn/direct/b743b9861d4d4121ac4345216ae5fff0.jpeg

思路①:暴力解,双重循环嵌套,遍历所有解找到最终答案,时间复杂度O(n²),超时pass

思路②:滑动窗口,也就是双指针,其实就是对双重循环的优化,把双重循环变成一次循环,降低时间复杂度到O(n),其中i表示起始位置,j表示终止位置,当区间和小于target,j往后滑动,当区间和>=target,i往前滑动,最终找到满足条件的最小区间长度。

第一次编译没加上数组最大和的判断,在nums=[1,1,1,1,1,1,1,1]时没通过,所以在进入循环前可以加上一个数组最大和的判断,当最大和小于target时不符合条件直接return 0,当最大和等于target返回数组长度,当最大和大于target再进入循环找最小长度

int minSubArrayLen(int target, int* nums, int numsSize) {
    //初始化最小长度为数组长度
    int minL=numsSize;
    int sum=0;//用于记录区间内的和
    int i=0,j=0;//i记录初始位置,j记录终止位置
    int k=0;
    int Maxsum=0;
    //先检查数组最大和是否满足>=target的条件
    while(k<numsSize)
    {
        Maxsum+=nums[k++];
    }
    if(Maxsum<target) return 0;
    if(Maxsum==target) return numsSize;
    else
    {
        for(j=0;j<numsSize;j++)
    {
        sum+=nums[j];
        while(sum>=target)
        {
            int L=j-i+1;//用于记录当前区间长度
            if(L<minL)
            {
                minL=L;//若当前区间长度 小于最小长度,则更新最小长度为当前区间长度
            }
            sum-=nums[i++];
        }
    }
    return minL;
    }
    
}