LeetCode 分类刷题:209. 长度最小的子数组

题目

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

找出该数组中满足其总和大于等于target的长度最小的 子数组 [nums(l), nums(l+1), ..., nums(r-1), nums(r)] ,并返回其长度**。** 如果不存在符合条件的子数组,返回 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

解析

采用滑动窗口的方法,连续子数组可以表示为 nums(left)......nums(right),即从第 left 项到第 right 项。

  • 当下标为left...right 的子数组和 >= target,如果此时扩张窗口,>= target的条件依然满足(因为是数组和target都是正整数),但背离"最小长度"的要求。
    • 所以选择收缩窗口:当下标为left...right 的子数组和 >= target时,left 继续右移,并更新最小长度,直到不再满足>= target的条件。
  • 当窗口left...right的子数组和 < target时,right 右移,扩大窗口,更新子数组和,直到条件重新满足。

总结

扩张窗口:为了找到一个可行解,找到了就不再扩张,因为扩张不再有意义。

收缩窗口:在长度上优化该可行解,直到条件被破坏。

继续寻找下一个可行解,然后再优化到不能优化......

作者:笨猪爆破组

链接:https://leetcode.cn/problems/minimum-size-subarray-sum/solutions/306148/jin-tian-mei-tu-yi-dong-chuang-kou-xian-zhao-dao-y/

来源:力扣(LeetCode)

答案

javascript 复制代码
/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function(target, nums) {
    const n = nums.length;
    let ans = n + 1;    //初始化答案为不可能的值
    let s = 0, left = 0;
    for(let right = 0; right < n; right++) {    //移动右指针,扩大窗口
        s += nums[right];
        while(s >= target) {    //满足子数组和大于等于target条件的情况下
            ans = Math.min(ans, right - left + 1);    //更新最小长度值
            s -= nums[left];
            left++;    //移动左指针,缩小窗口
        }
    }
    return ans > n ? 0 : ans;    //若ans大于数组长度,则返回0
};

复杂度分析

时间复杂度:O(n),其中 n 为 nums 的长度。虽然写了个二重循环,但是内层循环中对 left 加一的总执行次数不会超过 n 次,所以总的时间复杂度为 O(n)。

空间复杂度:O(1),仅用到若干额外变量。

作者:灵茶山艾府

链接:https://leetcode.cn/problems/minimum-size-subarray-sum/solutions/1959532/biao-ti-xia-biao-zong-suan-cuo-qing-kan-k81nh/

来源:力扣(LeetCode)

相关推荐
小蒋学算法18 小时前
算法-交替删除操作后最后剩下的整数-跟着灵茶山艾府学算法
数据结构·算法
荆棘鸟智能18 小时前
林业遥感长势评估怎么做?从NDVI时序分析到LiDAR蓄积量回归
人工智能·算法·智慧林业
hhb_61819 小时前
AIRAGDebug:一键定位RAG链路异常
人工智能·python·算法
朝朝辞暮i19 小时前
C++ 第 6 课:switch —— 多状态选择
开发语言·c++·算法
苏打豆20 小时前
Pinocchio源码阅读——刚体运动物理量空间变换及求导
c++·线性代数·算法·矩阵·机器人
FluxArt20 小时前
GPT Image 2.5 中文提示词教程:Flux Art 可复用模板
前端·gpt·算法
思麟呀20 小时前
位运算:从一个整数到一个集合
c语言·数据结构·c++·算法
阜阳山君GEO21 小时前
豆包 SEED 新版本 GEO 优化:信源金字塔、打分体系与避坑落地指南
人工智能·算法
晓天衡宇•评测社区21 小时前
晓天衡宇亮相 2026 云栖大会:迈向更可信的高质量评测
人工智能·算法·机器学习
CQU_JIAKE21 小时前
9.12[a]
算法