Leetcode209. 长度最小的子数组

LeetCode209——长度最小的子数组 我的LeetCode代码仓:https://github.com/617076674/LeetCode 原题链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum/description/ 题目描述: 知识点:滑动窗口法 思路一:从左到右遍历数组寻找最小长度 时间复杂度是O(n ^ 2),其中n为nums数组的长度。... 阅读详情

Every day a Leetcode

题目来源:209. 长度最小的子数组

解法1:暴力

暴力法是最直观的方法。

初始化子数组的最小长度为无穷大,枚举数组 nums 中的每个下标作为子数组的开始下标,对于每个开始下标 i,需要找到大于或等于 i 的最小下标 j,使得下标范围 [i, j] 的元素和大于或等于 target,并更新子数组的最小长度(此时子数组的长度是 j−i+1)。

代码:

/*
 * @lc app=leetcode.cn id=209 lang=cpp
 *
 * [209] 长度最小的子数组
 */

// @lc code=start
class Solution
{
public:
    int minSubArrayLen(int target, vector<int> &nums)
    {
        // 特判
        if (nums.empty())
            return 0;
        int n = nums.size(), min_len = INT_MAX;
        for (int i = 0; i < n; i++)
        {
            int sum = 0;
            for (int j = i; j < n; j++)
            {
                sum += nums[j];
                if (sum >= target)
                {
                    int len = j - i + 1;
                    min_len = min(min_len, len);
                    break;
                }
            }
        }
        return min_len == INT_MAX ? 0 : min_len;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n2),其中 n 是数组 nums 的长度。需要遍历每个下标作为子数组的开始下标,对于每个开始下标,需要遍历其后面的下标得到长度最小的子数组。

空间复杂度:O(1)。

解法2:前缀和 + 二分查找

为了使用二分查找,需要额外创建一个数组 preSum 用于存储数组 nums 的前缀和,其中 preSum[i] 表示从 nums[0] 到 nums[i−1] 的元素和。得到前缀和之后,对于每个开始下标 i,可通过二分查找得到大于或等于 i 的最小下标 bound,使得 preSum[bound]−preSum[i−1]≥target,并更新子数组的最小长度(此时子数组的长度是 static_cast<int>((bound - preSum.begin()) - (i - 1)))。

代码:

/*
 * @lc app=leetcode.cn id=209 lang=cpp
 *
 * [209] 长度最小的子数组
 */

// @lc code=start
class Solution
{
public:
    int minSubArrayLen(int target, vector<int> &nums)
    {
        // 特判
        if (nums.empty())
            return 0;
        int n = nums.size();
        vector<int> preSum(n + 1, 0);
        for (int i = 1; i <= n; i++)
            preSum[i] = preSum[i - 1] + nums[i - 1];
        int min_len = INT_MAX;
        for (int i = 1; i <= n; i++)
        {
            int cur_target = preSum[i - 1] + target;
            auto bound = lower_bound(preSum.begin(), preSum.end(), cur_target);
            if (bound != preSum.end())
                min_len = min(min_len, static_cast<int>((bound - preSum.begin()) - (i - 1)));
        }
        return min_len == INT_MAX ? 0 : min_len;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(nlogn),其中 n 是数组 nums 的长度。

空间复杂度:O(n),其中 n 是数组 nums 的长度。额外创建数组 preSum 存储前缀和。

解法3:滑动窗口

定义两个指针 start 和 end 分别表示子数组(滑动窗口窗口)的开始位置和结束位置,维护变量 sum 存储子数组中的元素和(即从 nums[start] 到 nums[end] 的元素和)。

每一轮迭代,将 nums[end] 加到 sum,如果 sum≥target,则更新子数组的最小长度(此时子数组的长度是 end-start+1),然后将 nums[start] 从 sum 中减去并将 start 右移,直到 sum<target,在此过程中同样更新子数组的最小长度。在每一轮迭代的最后,将 end 右移。

代码:

/*
 * @lc app=leetcode.cn id=209 lang=cpp
 *
 * [209] 长度最小的子数组
 */

// @lc code=start

// 前缀和 + 二分查找

// class Solution
// {
// public:
//     int minSubArrayLen(int target, vector<int> &nums)
//     {
//         // 特判
//         if (nums.empty())
//             return 0;
//         int n = nums.size();
//         vector<int> preSum(n + 1, 0);
//         for (int i = 1; i <= n; i++)
//             preSum[i] = preSum[i - 1] + nums[i - 1];
//         int min_len = INT_MAX;
//         for (int i = 1; i <= n; i++)
//         {
//             int cur_target = preSum[i - 1] + target;
//             auto bound = lower_bound(preSum.begin(), preSum.end(), cur_target);
//             if (bound != preSum.end())
//                 min_len = min(min_len, static_cast<int>((bound - preSum.begin()) - (i - 1)));
//         }
//         return min_len == INT_MAX ? 0 : min_len;
//     }
// };

// 滑动窗口

class Solution
{
public:
    int minSubArrayLen(int target, vector<int> &nums)
    {
        // 特判
        if (nums.empty())
            return 0;
        int n = nums.size();
        int min_len = INT_MAX;
        int sum = 0, start = 0, end = 0;
        while (end < n)
        {
            sum += nums[end];
            while (sum >= target)
            {
                int len = end - start + 1;
                min_len = min(min_len, len);
                sum -= nums[start];
                start++;
            }
            end++;
        }
        return min_len == INT_MAX ? 0 : min_len;
    }
};
// @lc code=end

结果:

在这里插入图片描述

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

空间复杂度:O(1)。

解决vscode无法运行npm命令的问题(cmd可行) Powershell以及vscode中npm命令使用不了 阅读详情

相关推荐

进程间通信的七种方法实战演示!值得收藏!

线程和进程间的通讯(Inter-Process Communication, IPC)是操作系统中的一个重要概念,用于实现不同进程或同一进程中的不同线程之间的数据交换和协调。以下是几个常见的进程间通信的方式:管道、消息队列、共享内存、信号、套接字、信号量、文件映射

十年饮冰,难凉热血,保持热爱,奔赴星海! 2816

leetcode209 长度最小的子数组(C++)

同样使用两个指针,初始化两个指针nums[i], nums[j]均指向数组的首元素。继续判断sum是否满足条件,不断右移i,减掉nums[i]的值,直到sum=target时,记录元素个数result,此时的result一定为以。

DoQi_ng的博客 1644

示波器实测RGMII信号:从125MHz时钟判断千兆模式,到时序抓取与PHY寄存器避坑

本文详细介绍了使用示波器实测RGMII信号的完整流程,包括125MHz时钟频率判断、时序参数测量及PHY寄存器配置避坑指南。通过实战操作和典型故障案例分析,帮助硬件工程师快速定位和解决千兆以太网接口的调试问题,提升通信稳定性。

weixin_30015371的博客 260

力扣第209题“长度最小的子数组”

本文详细解读了力扣第209题“长度最小的子数组”,通过使用滑动窗口的方法高效地解决了这一问题,并提供了详细的解释和模拟面试问答。希望读者通过本文的学习,能够在力扣刷题的过程中更加得心应手。

10年数据\经营分析经验,现任大厂数据分析负责人 739

Nature风格的北半球投影图,几行代码就能绘制...

在子刊***Nat. Clim. Chang.***中,通过北极俯视投影表示NAO和AO的EOF分解。仅在定义图层的时候设置为该投影,其余设置content,绘制contourf都是PlateCaree。如子刊Nature Geosci中表示了海冰的漂移,还添加了DEM底图,非常美观。以海温数据为例,ERA5月温度平均,是一张721*1440的0.25degTIF。现在的结果看起来不错,但太大了,我们如果只需要北半球的数据,则需要指定经纬度。绘制完结果也是正方形,和ArcGIS差不多,见之前的推文。

wlh2067的博客 1292

星网锐捷语音网关密码重置恢复出厂设置

星网锐捷语音网关---密码重置 第一种星网锐捷SVX网关恢复出厂设置的方法 eth1口 任意口插网线,连接电脑并设置电脑固定ip为: 一, 二 网页输入: 192.168.88.86 admin 默认密码 admin 登陆。 忘记密码 可通过以下方法重置: 三: 通过crt或者 shell工具 ,连接 root@192.168.88.86 连续输入两次 passwd a12345678 reboot重启后。通过账号 密码 a12345678 即可登陆系...

cibazhanji2176的博客 1万+

LeetCode 209 题:长度最小的子数组

LeetCode 第209题要求给定一个正整数数组nums和一个正整数target,找出具有最小长度的连续子数组,使得子数组的和大于或等于target。如果不存在这样的子数组,返回0。

weixin_48941116的博客 1235

使用R语言获取data.frame中指定列的数据

这里以"df"为例,包含三列数据:“列1”、“列2"和"列3”。通过以上代码,我们成功获取了"列1"和"列3"的数据,并将它们分别存储在了变量"column1"和"column3"中。假设我们有一个名为"df"的data.frame,其中包含了多个列,我们想要提取其中的某一列。符号,我们可以从data.frame中提取出"列2"的数据,并将其赋值给变量"column2"。符号,我们可以轻松提取出data.frame中特定列的数据,并将其存储在变量中供进一步的分析和处理使用。假设我们要获取"列2"的数据。

DevRevolt的博客 2321

力扣(LeetCode)209. 长度最小的子数组(C语言)

一题双解。

墨染 502

黑猫带你学Nand第8篇:NandFlash的供电情况详解

是指在任何工作条件下,设备允许的最大电压、电流、功率以及温度等参数的界限值。

黑猫奥利奥的博客 1148

11年电赛综合测评——单运放三角波发生器

目录 背景知识科普: 原理:局部负反馈+大环负反馈+积分器 仿真图如下: 背景知识科普: 反馈电路是将放大器输出信号(电压或电流)的一部分或全部,回收到放大器输入端与输入信号进行比较(相加或相减),并用比较所得的有效输入信号去控制输出,这就是放大器的反馈过程。 一、反馈放大器反馈极性的经验分析法—符号法 分析步骤1.在输入端上加上一个“+”或“-”的输入信号,按瞬时极性法标出反馈放大器中各个电极(基极b,集电极c,发射极e)电压的瞬时性。 2.判断经放大和反馈后得到的反馈信号Xf的瞬时极性

沉迷单车的追风少年 9905

Leetcode——209 长度最小的子数组

给定一个含有n个正整数的数组和一个正整数target找出该数组中满足其总和大于等于target的长度最小的,并返回其长度**。**如果不存在符合条件的子数组,返回0。

V_Akoasm的博客 1882

【3天快速入门WPF】1-从最简单的xaml开始

首先我们要知道xaml语法中声明即定义,意思就是“见到元素就相当于创建实例”,MainWindow.xaml的主干是一个元素里包含着一个 元素。这段程序就是在定义一个Window类的实例,这个实例的一个组成部分是一个Grid类的实例。

Zy100Papa的博客 1623

【力扣】 209. 长度最小的子数组

【力扣】 209. 长度最小的子数组

Danger的博客 648

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LeetCode 209.长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

2301_80211119的博客 426

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

力扣209:长度最小的子数组

本文介绍了力扣209题"长度最小的子数组"的解法。题目要求找出数组中总和大于等于给定目标值的最短连续子数组长度。采用滑动窗口算法,通过维护一个可变窗口(start和end指针),当窗口内元素和≥target时记录长度并收缩左边界,否则扩展右边界。该算法时间复杂度O(n),空间复杂度O(1),能高效解决问题。核心思路是动态调整窗口大小,在满足条件时不断优化最小长度。代码实现简洁,先处理特殊情况,再用双指针遍历数组,最后返回最小长度或0(无解时)。

weixin_74285822的博客 4453

LeetCode 209长度最小的子数组

LeetCode 209长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。 输入:s = 7, nums = [2, 3, 1, 2, 4, 3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的连续子数组。 暴力法(时间复杂度:O(n2) ) 遍历每一个数字,依次将每个数字为起始点下标开始添加数字,记录当总和大于等于s时的长度 class Sol

XBlog 295

leetcode力扣209.长度最小的子数组

对此我的理解是,当窗口变为1,2,1,4时就可以知道2 2,1肯定不满足条件了,毕竟这个窗口挪到1,2,1,4了才刚刚满足条件,那单独的2和2,1肯定更不满足了,所以我们可以直接跳过。滑动窗口根据上一步的结果聪明地直接pass掉了更不满足条件的情况,提高了效率,这就是滑动窗口有效的原因。然后保持尾部不动,从左往右逐个元素地收缩头部,每个被抛弃的元素都要从刚刚收集的sum中减去,并更新最小窗口长度(最小毛毛虫的长度),直到不满足while循环的条件。数组:1,2,1,4,3。需要的Target=7。

alili_alili的博客 234

LeetCode第209题长度最小的子数组

209. 长度最小的子数组 题目: 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。 示例: 输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum 著作权归领扣网络

qq_41967623的博客 363

【LeetCode面试150】——209长度最小的子数组

【LeetCode面试150】——209长度最小的子数组题目讲解和代码实现

Junmo12345的博客 1576

209.长度最小的子数组(力扣LeetCode)

numsr-1, numsr] ,并返回其长度。如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。输入:target = 15, nums = [5,1,3,5,10,7,4,9,2,8]输入:target = 11, nums = [1,1,1,1,1,1,1,1]输入:target = 7, nums = [2,3,1,2,4,3]输入:target = 4, nums = [1,4,4]解释:子数组 [4,3] 是该条件下的长度最小的子数组。

m0_73841621的博客 763

【力扣】<2>LeetCode 209 长度最小的子数组

考察算法:【双指针】【前缀和 + 二分查找】

Hou_lang_LJ的博客 290

LeetCode第209题_长度最小的子数组

给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其和≥ target的长度最小的,并返回其长度。如果不存在符合条件的子数组,返回0。

qq_40263592的博客 1476

leetcode-209 | 长度最小的子数组

title: leetcode-209 | 长度最小的子数组 date: 2019-4-24 16:37:05 comments: true categories: “leetcode” tags: - leetcode 中等难度 - 滑动窗口 209. 长度最小的子数组(Minimum Size Subarray Sum) 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和...

梦否 380

LeetCode209. 长度最小的子数组

LeetCode209. 长度最小的子数组 方法一 暴力枚举所有可能的子数组,也就是枚举子数组的所有开始下标和结束下标,计算子数组的和,如果子数组的和小于等于s,就更新最小长度。 class Solution { public: int minSubArrayLen(int s, vector<int>& nums) { if(nums.size() == 0) { //数组为空的情况需要特判 retur

RJ_theMag的博客 378

【从零开始刷力扣002】leetcode209-长度最小的子数组

答:当现在的window与target不一致时,向右移,但在第一个while中可以执行一次right++这样保证了窗口是左开右闭。(相当于窗口内的数据范围是[le,ri)部分的数据。答:当右移满足时,开始收缩,但收缩过程正式寻找。2.什么时候收缩,收缩几次?在这里可能更改result。1.什么时候右移右指针?

2401_86223056的博客 399
上一篇: Leetcode201. 数字范围按位与
下一篇: Leetcode211. 添加与搜索单词 - 数据结构设计
UestcXiye
博客等级 码龄8年 9028粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值