LeetCode 「中等」209.长度最小的子数组

sankigan2025-3-10算法LeetCode

长度最小的子数组open in new window

题目描述

给定一个含有 n 个正整数的数组和一个正整数 target

找出该数组中满足其总和大于等于 target 的长度最小的子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0

示例

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

输入:target = 4, nums = [1,4,4]
输出:1

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

解答

Code
/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function(target, nums) {
  let left = 0; // 左指针
  let right = 0; // 右指针
  let currentSum = 0; // 当前窗口的和
  let minLength = Infinity; // 用于记录最小长度,初始值为无穷大

  while (right < nums.length) {
    currentSum += nums[right]; // 扩展,窗口将右指针的值加入当前和

    // 当前窗口的和大于等于目标值
    while (currentSum >= target) {
      minLength = Math.min(minLength, right - left + 1); // 更新最小长度
      currentSum -= nums[left]; // 收缩窗口,移除左指针的值
      ++left; // 移动左指针
    }

    ++right; // 移动右指针
  }

  return minLength === Infinity ? 0 : minLength;
};
更新于 2025/3/10 19:52:24
ON THIS PAGE