209. 长度最小的子数组

46 阅读1分钟

209. 长度最小的子数组

已解答

中等

相关标签

premium lock icon相关企业

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

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

 

示例 1:

输入: target = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的子数组。

示例 2:

输入: target = 4, nums = [1,4,4]
输出: 1

示例 3:

输入: target = 11, nums = [1,1,1,1,1,1,1,1]
输出: 0

 

提示:

  • 1 <= target <= 109
  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 104

 

进阶:

  • 如果你已经实现 **O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。

题解:

用的是滑动窗口。

#include <stdio.h>
#include <stdlib.h>

int min(int a, int b)
{
    return a <= b?a:b;
}

int main()
{
    int size, i, target, left = 0, right = 0, minlength, sum;
    scanf("%d", &size);
    int* nums = (int*)malloc(sizeof(int) * size);
    for (i = 0;i <= size - 1;i ++)
    {
        scanf("%d", &nums[i]);
    }
    scanf("%d", &target);
    minlength = size + 1;
    sum = nums[0];
    while (left <= right && right <= size - 1)
    {
        if (sum >= target)
        {
            minlength = min(minlength, right - left + 1);
            sum = sum - nums[left];
            left ++;
        }
        else if (sum < target)
        {
            right ++;
            sum = sum + nums[right];
        }
    }
    if (minlength <= size)
    {
        printf("%d", minlength);
    }
    else printf("0");
    return 0;
}