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

相关推荐
jimy17 小时前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++
会编程的小孩9 小时前
C++ 定时器
c++
沫璃染墨10 小时前
从零入门计算机网络系列(十一):HTTP协议进阶——从重定向原理到GET/POST与Fiddler抓包
linux·服务器·开发语言·网络·c++·tcp/ip·html
揽星河..12 小时前
【C语言】分支和循环
c语言·c++·算法
Fuyo_111913 小时前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法
傲世仙尊14 小时前
继承-类设计层次复用切片转换与菱形继承的死结
c++
架构师伯子明14 小时前
FFmpeg C++学习(一):编译和demo
开发语言·c++·学习
纪念 22915 小时前
C++算法(六)
开发语言·c++·算法
ShineWinsu15 小时前
对于Qt:QCheckBox常见属性的详细解析
c++·qt·面试·笔试·gui·qcheckbox·多选框
AI的探索之旅16 小时前
97 个 OpenCV 实例(三十七):二维码识别,一张图四个码的陷阱
c++·opencv·计算机视觉