leetcode 209 长度最小的子数组(C语言)

这题解题的关键在于如何设置(找到)连续的子数组。

有两种方法,一种是暴力破解,不断的找到合适的连续子数组;

int minSubArrayLen(int* nums, int target, int numsSize)
{
    int result = INT32_MAX; /// 设置最终结果,可以设置为0;
    int sum; /// 设置子数组总和;
    int subLength; /// 设置子数组长度;

    for (int i = 0; i < numsSize; i++)
    {
        sum = 0; /// 在for循环内部重置子数组总和,因为每次循环都要初始化一次;
        
         for (int j = i; j < numsSize; j++) /// 右指针总是和 i 相等;
        {
            sum += nums[j];
            if (sum >= target)
            {
                subLength = j - i + 1; /// 获取子数组长度;
                result = result < subLength ? result : subLength; 
                break; /// 找到该循环的子数组,退出内层循环;
            }
            
        }
    }

    return result == INT32_MAX ? 0 : result; /// 如果result没有赋值的话返回0.

}

另外一种是动态窗口

int minSubArrayLen(int* nums, int target, int numsSize)
{
    int sum  = 0; /// 设置子数组总和
    int result = INT32_MAX; // 最终结果设置
    int subLength = 0; /// 设置子数组长度
    int i = 0; /// 左指针
    

    for (int j = 0; i < numsSize; i++)
    {
        sum += nums[j]; /// 右指针往后走,直到子数组总和大于等于 target
        while (sum >= target)
        {
            subLength = j - i + 1; /// 获取子数组长度
            result = result < subLength ? result : subLength; 
            sum -= nums[i++]; /// 更新左指针区间;
        }
        
    }

    return result == INT32_MAX ? 0 : result;
}

其实滑动窗口也是双指针法的一种,不过它更像一个窗口的移动,所以被称为滑动窗口。

滑动窗口的精华在于左指针的更新,如果当前窗口值大于target 左指针则往后走,缩小窗口。

此博客仅用于个人学习;

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