给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3]
是该条件下的长度最小的子数组。
思路:利用滑动窗口的思想,定义快慢指针,当快慢指针之间的元素和大于等于目标值,向前移动慢指针,不断找最小的区间长度使得其元素和大于等于目标值
代码:
func minSubArrayLen(target int, nums []int) int {
sum:=0//区间元素之间的和
i:=0//慢指针
flag:=false//flag标志是否存在区间其和大于目标值,不存在返回0
result:=len(nums)//result先取区间长度的最大值
for j:=0;j<len(nums);j++{//快指针
sum+=nums[j]//一直加,直到区间和>=target
for sum>=target{//若小于target则让快指针往后移
sub:=j-i+1//区间长度即元素个数
result=min(sub,result)//最终结果取区间长度的最小值
sum=sum-nums[i]//让慢指针逐个往前移,不断探寻大于等于target的最小区间长度
i++
flag=true//存在区间其元素和>=target,不用返回0了
}
}
if flag==false{
return 0
}
return result
}