题目描述
题目地址:https://leetcode-cn.com/problems/minimum-size-subarray-sum/
给定一个含有 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] <= 105
暴力解法(C语言)
int minSubArrayLen(int target, int* nums, int numsSize)
{
/*
i用于控制子数组长度,范围从1到sumsize
j用于遍历数组元素
sum是子数组元素之和
count用于统计当前相加元素个数
*/
int i,j,count,sum;
int result=0;
for(i=1;i<=numsSize;i++)
{
count=0;
sum=0;
for(j=0;j<numsSize;j++)
{
if(count>=i)
{
count=0;
sum=0;
j=j-i+1;
}
if(count<i)
{
sum=sum+nums[j];
count++;
if(sum>=target)
{
result=i;
break;
}
}
}
if(sum>=target)
{
break;
}
}
return result;
}
优化解法(C语言)
int minSubArrayLen(int target, int* nums, int numsSize)
{
/*
i用于限定窗口左侧
j用于限定窗口右侧
result一开始取一个极大数
sum是窗口内数组元素之和
当sum小于target时,j右移一位
当sum大于等于target时,result取当前窗口长度,i右移一位
同时sum减去窗口内最左侧的元素,再与target进行对比
*/
int i=0;
int j=0;
long long result=100000000000;
int sum=0;
for(j;j<numsSize;j++)
{
sum+=nums[j];
while(sum>=target)
{
result = result>(j-i+1)?(j-i+1):result;
sum-=nums[i];
i++;
}
}
return result==100000000000?0:result;
}
GitHub分享
https://github.com/zhzz1996