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)。

相关推荐
朝朝辞暮i14 分钟前
C++ 第 33 课:事件循环——spin() 到底在干什么
开发语言·c++·算法
殷色玫瑰25 分钟前
AVL树:从平衡因子到四种旋转的完整实现
c语言·数据结构·c++·算法·visualstudio
进化中的刀盾兽1 小时前
从零实现 C++ AI 大模型接入 SDK(九):LLMManager 统一模型管理与请求路由
c++
会周易的程序员1 小时前
STVM OSAL 层架构设计文档
c++·物联网·嵌入式·虚拟机·iot·软plc·iec61131
.YM.Z1 小时前
C++——【红黑树】原理详解:定义、性质、插入变色与旋转实现
开发语言·c++
y1su2 小时前
Leetcode 二分模板
java·数据结构·算法·leetcode·排序算法
无名猿2 小时前
constexpr 能力扩张:从 C++11 到 C++20 的编译期计算
c++·性能优化·现代c++·编译期
007张三丰2 小时前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·c语言·c++·内存管理
Pniubi3 小时前
力扣55跳跃游戏(贪心)
算法·leetcode·游戏
三月微暖寻春笋3 小时前
【和春笋一起学C++】(七十二)类模板
开发语言·c++·实例·类模板·使用类模板·数组模板