已解答
中等
相关标签
相关企业
给定一个含有 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 <= 1091 <= nums.length <= 1051 <= 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;
}