209. 长度最小的子数组
给定一个含有 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
来源:力扣(LeetCode)
链接:https:///problems/minimum-size-subarray-sum
给定的代码实现了一个函数,用于找到一个给定向量 nums
中连续子数组的最小长度,使得子数组的元素之和等于目标值 target
。下面是代码的解释:
int minSubArrayLen(int target, vector<int>& nums) {
int length = nums.size();
if (length == 0) {
return 0;
}
int begin = 0;
int end = 0;
int sum = 0;
int ans = INT_MAX;
while (end < length) {
sum += nums[end];
while (sum >= target) {
ans = min(end - begin + 1, ans);
sum -= nums[begin];
begin++;
}
end++;
}
return ans == INT_MAX ? 0 : ans;
}
以下是代码的工作原理:
-
函数
minSubArrayLen
接受两个参数:target
(目标和)和nums
(数字向量)。 -
变量
length
初始化为nums
向量的大小。如果向量为空,则函数立即返回 0。 -
变量
begin
和end
表示当前正在考虑的子数组的左右边界。 -
变量
sum
用于记录当前子数组中元素的和。 -
变量
ans
初始化为一个int
类型的最大可能值(INT_MAX
)。该变量将存储子数组的最小长度,使其元素之和等于目标值。 -
外部的
while
循环迭代end
索引,将子数组向右扩展。 -
在循环内部,将当前元素
nums[end]
添加到sum
中。 -
内部的
while
循环用于从左边(begin
索引)缩小子数组,只要和大于等于目标值。这一步是为了找到最小长度。 -
在内部循环中,将当前子数组长度(
end - begin + 1
)与当前最小长度ans
进行比较,并将较小的值存储在ans
中。 -
从
sum
中减去begin
索引处的元素,并将begin
递增,以缩小子数组。 -
一旦内部循环结束,外部循环继续通过递增
end
来向右扩展子数组。 -
最后,函数返回
ans
,它将是元素之和等于目标值的子数组的最小长度。如果找不到这样的子数组,ans
仍然为INT_MAX
,函数返回 0。
总体而言,该代码利用滑动窗口技巧高效地找到元素之和等于目标值的子数组的最小长度。