412 字
2 分钟
209. 长度最小的子数组

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

思路#

  • 由于数组为连续数组,使用滑动窗口进行遍历。

注意,原题是大于等于,不是等于!!!。

代码流程#

  1. 创建双指针left, right,创建一个数字记录滑动窗口大小。窗口为左闭右开区间。
  2. 从左往右遍历。
    1. 如果当前数值小,增加right,更新数值。
    2. 如果当前数值大于等于,记录right - left,增加left,更新数值。
    3. 如果right == nums.size() && total < target遍历结束,返回0
  3. 边界条件right == nums.size()
    1. 数值小于target,手动退出循环
    2. 数值大于等于target,记录长度,移动left减小窗口大小。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int left = 0;
int right = 0;
int n = nums.size();
int total = 0;
int res = INT_MAX;
while (right <= n) {
// 左闭右开
if(total < target){
// 边界条件,如果right到末尾仍然小于,不允许再访问,直接退出。
if(right == n){
break;
}
total += nums[right];
right++;
}
else{
res = min(res, right - left);
total -= nums[left];
left++;
}
}
return res == INT_MAX ? 0 : res;
}
};
209. 长度最小的子数组
https://chrisnake11.github.io/blog/posts/coding/leecode/209-长度最小的子数组/
作者
Zheyv
发布于
2025-07-14
许可协议
CC BY-NC-SA 4.0