LeetCode209_长度最小的子数组

LeetCode209_长度最小的子数组

  • [标签:#数组 #二分查找 #前缀和 #滑动窗口](#数组 #二分查找 #前缀和 #滑动窗口)
  • [Ⅰ. 题目](#Ⅰ. 题目)
  • [Ⅱ. 示例](#Ⅱ. 示例)
  • [0. 个人方法:滑动窗口](#0. 个人方法:滑动窗口)

标签:#数组 #二分查找 #前缀和 #滑动窗口

Ⅰ. 题目

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

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

0. 个人方法:滑动窗口

使用滑动窗口的思想:

  1. 定义两个指针 start 和 end 表示窗口的左右边界。
  2. 每次将 end 指向的元素加入 sum 中。
  3. 若 sum >= target,就尝试收缩左边界 start,以缩短窗口长度,同时更新最小长度 min_len。
  4. 最后如果没找到满足条件的子数组,返回 0;否则返回最小长度。
cpp 复制代码
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n = nums.size();
        int start = 0, end = 0;
        int sum = 0;
        int min_len = n + 1; // 初始化为不可能的值

        while (end < n) {
            sum += nums[end]; // 先加上当前元素
            end++;           // 然后移动右指针

            // 如果 sum >= target,尝试缩小窗口
            while (sum >= target) {
                min_len = min(min_len, end - start); // 更新最小长度
                sum -= nums[start]; // 尝试移除左端元素
                start++;            // 移动左指针
            }
        }
        return (min_len == n + 1) ? 0 : min_len;
    }
};
  • 复杂度分析

    • 时间复杂度:O(n),其中 n 是数组的长度。指针 start 和 end 最多各移动 n 次。

    • 空间复杂度:O(1)。

相关推荐
汉克老师2 小时前
GESP2026年9月认证C++六级( 第三部分编程题(1、数组划分))精讲
c++·gesp·小学生·学c++编程
千里码aicood2 小时前
基于PLC与机器视觉的智能分拣控制系统设计
c++·自动化·plc
漂流瓶jz2 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
圣保罗的大教堂2 小时前
leetcode 835. 图像重叠 中等
leetcode
朽棘不雕2 小时前
进一步了解模板
c++
汉克老师5 小时前
CSP-J 2026 初赛试题解析(第一部分:选择题(8-15))精讲
c++·csp-j·小学生·学c++编程
wabs6666 小时前
关于二叉树【力扣572.另一棵树的子树的思考】
数据结构·c++·算法·leetcode·二叉树
hanlin036 小时前
刷题笔记:力扣第41题-缺失的第一个正数
笔记·算法·leetcode
风合星语7 小时前
2026 ROS 2 Lyrical C++ 入门(五):Action 实战——任务反馈、取消与超时处理
c++·机器人·ros2·异步编程·lyrical
91刘仁德7 小时前
C++ 继承和多态 设计模式
c语言·c++·笔记