LeetCode 209. 长度最小的子数组(Minimum Size Subarray Sum)

LeetCode 209. 长度最小的子数组(Minimum Size Subarray Sum)

✅ 难度:中等

✅ 考察点:滑动窗口 / 双指针 / 前缀和优化


🔗 题目链接

👉 https://leetcode.com/problems/minimum-size-subarray-sum/


📖 题目描述

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

找出 和 ≥ target 的 连续子数组 的 最小长度。

如果不存在,返回 0。


示例

bash 复制代码
输入:
target = 7
nums = [2,3,1,2,4,3]

输出:
2

解释:
子数组 [4,3] 的和 ≥ 7,且长度最小

💡 解题思路(滑动窗口)

核心思想

由于数组元素 全为正数 ,可以使用 双指针滑动窗口:

  • 右指针 i 扩张窗口,累加 sum
  • 当 sum ≥ target 时:
    • 更新最小长度
    • 左指针 j 收缩窗口
  • 直到 sum < target

为什么可以用滑动窗口?

✅ 关键性质:

  • 所有数都是正数
  • 扩大窗口 → sum 增大
  • 缩小窗口 → sum 减小

因此不会出现"缩了又变大"的情况。


✅ AC 代码(Java)

✅ 你的 AC 代码(简洁高效)

java 复制代码
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int n = nums.length;
        int res = Integer.MAX_VALUE;
        int sum = 0;
        int j = 0; // 左端点

        for (int i = 0; i < n; i++) {
            sum += nums[i];

            while (sum >= target) {
                res = Math.min(res, i - j + 1);
                sum -= nums[j];
                j++;
            }
        }

        return res == Integer.MAX_VALUE ? 0 : res;
    }
}

⏱ 复杂度分析

项目 复杂度
时间复杂度 O(n)
空间复杂度 O(1)

✅ 每个元素最多被访问两次(一次进窗口,一次出窗口)


⚠️ 注意事项(非常重要)

1️⃣ 必须使用 while,不能用 if

java 复制代码
while (sum >= target)

❌ 错误:

java 复制代码
if (sum >= target)

📌 因为可能多次收缩窗口


2️⃣ 返回值的处理

java 复制代码
return res == Integer.MAX_VALUE ? 0 : res;

✅ 防止无解情况


3️⃣ 为什么不用前缀和 + 二分?

方法 时间复杂度
滑动窗口 O(n) ✅
前缀和 + 二分 O(n log n)

✅ 本题滑动窗口更优


4️⃣ 数组必须为正(关键前提)

❌ 如果有负数:

  • 滑动窗口不再适用
  • 必须用前缀和 + 二分

🧠 面试加分点

  • 明确指出 正数数组 的前提
  • 说明 为什么 while 不能换成 if
  • 能推导 O(n) 时间复杂度
  • 能现场手写出该模板

🔁 滑动窗口通用模板(一维数组)

java 复制代码
int left = 0;
for (int right = 0; right < n; right++) {
    sum += nums[right];
    while (sum >= target) {
        res = Math.min(res, right - left + 1);
        sum -= nums[left];
        left++;
    }
}

✅ 总结一句话

本题是滑动窗口的经典入门题:右指针扩张,左指针收缩,O(n) 一次遍历完成。

相关推荐
周厉5 小时前
ERP系统全景解析:核心模块与业务逻辑框架
java·服务器·前端
小O的算法实验室6 小时前
ASOC,分层分数阶粒子群算法+无人机电场路径规划
算法
傅科摆 _ py6 小时前
链表力扣复习
数据结构·leetcode·链表
重生之小比特6 小时前
【算法拾光】二分查找|搜索插入位置 + x 的平方根
算法
智购科技自动售卖机厂家6 小时前
双摄像头方案F1-score只有0.85,排查发现是上下视角的融合逻辑写反了~YH
python·单片机·嵌入式硬件·算法·eclipse
开开心心就好6 小时前
课堂随机点名工具,绿色版免安装双击即用
java·服务器·前端·ffmpeg·音视频·perl·symfony
code2cat6 小时前
Java高级篇之Socket:从建立连接到完整收发一条消息
java·开发语言
PD我是你的真爱粉6 小时前
成熟Agent系统设计深度研究报告
java·大数据·人工智能
鶴哥只手遮天7 小时前
Spring AI Alibaba 深度技术系列-第 05 章 编译与执行引擎:CompiledGraph、GraphRunner与三段式 Executor
java·人工智能·开源
开开心心_Every7 小时前
免费压缩软件WinRAR无弹窗、广告干扰
java·开发语言·前端·spring·智能手机·word·winrar