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 小时前
Leetcode刷题记录32——搜索二维矩阵 II
算法·leetcode·矩阵
D_aniel_5 小时前
Leetcode:回文链表
java·算法·leetcode·链表
Sheep Shaun6 小时前
C++类与对象—下:夯实面向对象编程的阶梯
c语言·开发语言·数据结构·c++·算法
wuqingshun3141597 小时前
蓝桥杯 19. 植树
c++·算法·蓝桥杯·深度优先·动态规划
王禄DUT8 小时前
网络延时 第四次CCF-CSP计算机软件能力认证
c++·算法
一道秘制的小菜8 小时前
AimRT从入门到精通 - 03Channel发布者和订阅者
linux·服务器·c++·vim·aimrt
wang__123009 小时前
力扣119题解
算法·leetcode·职场和发展
I AM_SUN9 小时前
42. 接雨水(相向双指针/前后缀分解),一篇文章讲透彻
c++·算法·leetcode
李匠20249 小时前
C++负载均衡远程调用学习之负载均衡算法与实现
运维·c++·学习·负载均衡