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) 一次遍历完成。

相关推荐
C++、Java和Python的菜鸟3 小时前
第7章 Java高级技术
java·开发语言
程序员佳佳3 小时前
模型网关灰度不是调百分比:把放量、观测和回滚做成账本
java·数据库·人工智能·redis·gpt·aigc·embedding
可靠的仙人掌3 小时前
SAC(Soft Actor-Critic)算法底座
开发语言·算法·php
Listen·Rain5 小时前
Springboot整合Ollama实现调用本地多模型
java·spring boot·后端
霸道流氓气质5 小时前
Java 工程师 AI 智能体(Agent)完整学习路线
java·人工智能·学习
海石5 小时前
单调栈复健,顺便,牺牲一下吧,空间复杂度!一切献给AC
算法·leetcode
海石5 小时前
JS击败94%,Hard题想不到动态规划,那就用数组和栈试试
算法·leetcode
aaPIXa6225 小时前
C++模板元编程:编译期计算Fibonacci数列
java·开发语言·c++
SunnyDays10115 小时前
Java 编辑 PDF:从增删改查到加密保护
java·修改 pdf·编辑 pdf
球king5 小时前
CC GUI 插件:在 IDEA 中使用 CodeX
java·ide·intellij-idea