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

相关推荐
Cinema KI36 分钟前
内存管理这一块
c++
1白天的黑夜11 小时前
哈希表-49.字母异位词分组-力扣(LeetCode)
c++·leetcode·哈希表
深耕AI1 小时前
【MFC典型类和函数:CString的字符串魔法与Afx全局函数的便利店】
c++·mfc
怀旧,1 小时前
【C++】19. 封装红⿊树实现set和map
linux·c++·算法
凯子坚持 c2 小时前
Redis核心通用命令深度解析:结合C++ redis-plus-plus 实战指南
c++·redis·log4j
神里流~霜灭2 小时前
(C++)数据结构初阶(顺序表的实现)
linux·c语言·数据结构·c++·算法·顺序表·单链表
John_ToDebug2 小时前
从源码视角全面解析 Chrome UI 布局系统及 Views 框架的定制化实现方法与实践经验
c++·chrome·架构
愚润求学2 小时前
【贪心算法】day7
c++·算法·leetcode·贪心算法
深耕AI3 小时前
【MFC简介:从基础概念到实际应用】
c++·mfc
六点半8883 小时前
【C++】C++11 篇二
开发语言·c++