leetcode209. 长度最小的子数组 c语言

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这题利用了滑动窗口,思路

我们先定义一个slow一个窗头,fast一个窗尾,再定义一个min表示窗口中最少元素个数,最后定义一个sum来保存当前窗口中的和。

可以将min设为无穷大,也可以将min设为0。

int min=INT_MAX;

先让slow和fast指向数组的首元素然后让fast依次遍历,如果发现了在这个slow和fast组成的窗口中的所有元素都大于等于target目标值就更新一下min。

min的更新判断

看一下min的初始值,如果min一开始设为0就要多一个判断条件以保证min能够记录下第一个值

​
if(min>fast-slow+1||min==0)

​min=fast-slow+1;//因为数组的下标是0开始的fast-slow是窗口的距离要加个1才是里面包含的元素

然后再要滑动这个窗口

就要用到循环让fast依次遍历,然后如果发现了在这个slow和fast组成的窗口中的所有元素都大于等于target目标值 就让slow向后走一步并且要重新计算当前窗口的sum然后再来判断sum是否还大于等于target,如果还是大于target就继续让slow移动一位。由此可见需要用上两层循环

int minSubArrayLen(int target, int* nums, int numsSize){
int fast=0,slow=0,min=0,sum=0;
while(fast=target)
    {
        sum=sum-nums[slow];
        if(min>fast-slow+1||min==0)
        {
           min=fast-slow+1;
        }
         
         slow++;
    }
    fast++;
    
}
return min;
}

你可能感兴趣的:(leetcode,算法)