创见博客
长度最小的子数组
七崽爱吃小饼干2025/12/29阅读 0专栏 算法合集

长度最小的子数组

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

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 1 <= target <= 109
  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 104

解法:

这题主要用滑动窗口解决,通过双指针来模拟滑动窗口

ts
function minSubArrayLen(target: number, nums: number[]): number {
    // 子数组的意思是nums的其中连续的一部分
    // 这题需要用滑动窗口求解
    // 滑动窗口可以用双指针来实现
    // 从最左边开始,滑动窗口的大小从1开始
    // 如果窗口内元素的和大于target,如果w=1那么就直接返回,如果w>1那么窗口左指针右移。
    // 如果窗口内元素的和小于target,那么右指针右移
    const n = nums.length
    let l = 0, r = 0, w = 1, sum = nums[0] // 左指针、右指针、窗口宽度、元素之和
    let res = Infinity // 结果
    while(r < n){
        if(sum >= target){
            // 窗口内元素和大于目标值
            if(w === 1) return 1 // 只有一个元素已经是最佳值了
            res = Math.min(res, w) // 更新最小窗口
            // 去掉窗口最左边的元素
            sum -= nums[l]
            l++
            w--
        }else{
            r++
            if(r >= n) break;
            // 添加右边的新元素
            sum += nums[r]
            w++
        }
    }
    if(res !== Infinity) return res
    return 0
};
评论
0/100