[优选算法]------滑动窗⼝——209. 长度最小的子数组

news2024/11/18 7:52:37

目录

 1.题目

1.解法⼀(暴⼒求解)(会超时):

 2.解法⼆(滑动窗⼝):

1.算法思路:

2.手撕图解

3.代码实现

 1.C++

2.C语言 


 1.题目

209. 长度最小的子数组

给定一个含有 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

提示:

  • 1 <= target <= 109
  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 105

1.解法⼀(暴⼒求解)(会超时):


算法思路:
「从前往后」枚举数组中的任意⼀个元素,把它当成起始位置。然后从这个「起始位置」开始,然
后寻找⼀段最短的区间,使得这段区间的和「⼤于等于」⽬标值。
将所有元素作为起始位置所得的结果中,找到「最⼩值」即可。

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        // 记录结果
        int ret = INT_MAX;
        int n = nums.size();
        // 枚举出所有满⾜和⼤于等于 target 的⼦数组[start, end]
        // 由于是取到最⼩,因此枚举的过程中要尽量让数组的⻓度最⼩
        // 枚举开始位置
        for (int start = 0; start < n; start++) {
            int sum = 0; // 记录从这个位置开始的连续数组的和
            // 寻找结束位置
            for (int end = start; end < n; end++) {
                sum += nums[end];  // 将当前位置加上
                if (sum >= target) // 当这段区间内的和满⾜条件时
                {
                    // 更新结果,start 开头的最短区间已经找到
                    ret = min(ret, end - start + 1);
                    break;
                }
            }
        }
        // 返回最后结果
        return ret == INT_MAX ? 0 : ret;
    }
};

 2.解法⼆(滑动窗⼝):


1.算法思路:


由于此问题分析的对象是「⼀段连续的区间」,因此可以考虑「滑动窗⼝」的思想来解决这道题。
让滑动窗⼝满⾜:从 i 位置开始,窗⼝内所有元素的和⼩于target(那么当窗⼝内元素之和
第⼀次⼤于等于⽬标值的时候,就是 i 位置开始,满⾜条件的最⼩⻓度)。


做法:将右端元素划⼊窗⼝中,统计出此时窗⼝内元素的和:


▪ 如果窗⼝内元素之和⼤于等于 target :更新结果,并且将左端元素划出去的同时继续判
断是否满⾜条件并更新结果(因为左端元素可能很⼩,划出去之后依旧满⾜条件)


▪ 如果窗⼝内元素之和不满⾜条件: right++ ,另下⼀个元素进⼊窗⼝。


相信科学(这也是很多题解以及帖⼦没告诉你的事情:只给你说怎么做,没给你解释为什么这么
做):

为何滑动窗⼝可以解决问题,并且时间复杂度更低


▪ 这个窗⼝寻找的是:以当前窗⼝最左侧元素(记为 left1 )为基准,符合条件的情况。也
就是在这道题中,从 left1 开始,满⾜区间和 sum >= target 时的最右侧(记为right1 )能到哪⾥。


▪ 我们既然已经找到从 left1 开始的最优的区间,那么就可以⼤胆舍去 left1 。但是如
果继续像⽅法⼀⼀样,重新开始统计第⼆个元素( left2 )往后的和,势必会有⼤量重复
的计算(因为我们在求第⼀段区间的时候,已经算出很多元素的和了,这些和是可以在计算
下次区间和的时候⽤上的)。
▪ 此时, rigth1 的作⽤就体现出来了,我们只需将 left1 这个值从 sum 中剔除。从right1 这个元素开始,往后找满⾜eft2 元素的区间(此时right1也有可能是满⾜的,因为 left1 可能很⼩。 sum 剔除掉left1 之后,依旧满⾜⼤于等于target )。这样我们就能省掉⼤量重复的计算。
▪ 这样我们不仅能解决问题,⽽且效率也会⼤⼤提升。
时间复杂度:虽然代码是两层循环,但是我们的 left 指针和right 指针都是不回退的,两者
最多都往后移动 n 次。因此时间复杂度是O(N)

2.手撕图解

3.代码实现

INT_MAX是C语言中的一个宏定义,表示整型数据类型int的最大值。在32位系统中,它的值为2147483647;在64位系统中,它的值为9223372036854775807。这个值可以用来进行数据类型转换、判断数据是否越界等操作。

 1.C++

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n = nums.size(), sum = 0, len = INT_MAX;
        for (int left = 0, right = 0; right < n; right++) {
            sum += nums[right];   // 进窗⼝
            while (sum >= target) // 判断
            {
                len = min(len, right - left + 1); // 更新结果
                sum -= nums[left++];              // 出窗⼝
            }
        }
        return len == INT_MAX ? 0 : len;
    }
};

2.C语言 

int minSubArrayLen(int target, int* nums, int numsSize)
{
    int sum = 0, len = INT_MAX;
    for (int left = 0, right = 0; right < numsSize; right++) {
        sum += nums[right];   // 进窗⼝
        while (sum >= target) // 判断
        {
            len = len < right - left + 1 ? len : right - left + 1; // 更新结果
            sum -= nums[left++];              // 出窗⼝
        }
    }
    return len == INT_MAX ? 0 : len;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1664993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pod介绍

一、前言 Pod 是 Kubernetes 中最小的部署单元&#xff0c;它可以包含一个或多个容器&#xff0c;以及共享的存储卷和网络命名空间&#xff0c;Pod 提供了一种抽象&#xff0c;用于组织和管理容器化的应用程序&#xff0c;并提供了一种灵活、轻量级的方式来部署和管理应用程序 …

基于JSP动漫论坛的设计与实现(四)

目录 功能模块测试 6.1 测试概述及所用方案 6.1.1软件测试概述 6.1.3 测试的步骤 6.1.4 测试的主要内容 6.1.5 测试方案 6.1.6测试设计 6.2 前端功能测试 6.2.1 登录功能测试 6.2.2 注册功能测试 6.2.3 发帖功能测试 6.2.4 回复帖子测试 6.3 后台功能测试 6…

ETL工具中JSON格式的转换方式

JSON的用处 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;其设计初衷是为了提升网络应用中数据的传输效率及简化数据结构的解析过程。自其诞生以来&#xff0c;JSON 已成为Web开发乃至众多软件开发领域中不可或缺的一部分&a…

C++:类与对象—继承

类与对象—继承 一、继承是什么&#xff1f;二、继承定义三、基类和派生类对象赋值转换四、继承中的作用域五、派生类的默认成员函数六、继承与友元七、继承与静态成员八、复杂的菱形继承及菱形虚拟继承九、继承的总结和反思十、考察重点 一、继承是什么&#xff1f; 继承(inh…

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (三)

基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 大家继续看 https://lilianweng.github.io/posts/2023-06-23-agent/的文档内容 第二部分&#xff1a;内存 记忆的类型 记忆可以定义为用于获取、存储、保留以及随后检索信息的过程。人脑中有多…

【qt】设计器实现界面

设计器实现界面 一.总体思路二.具体操作1.创建项目2.粗略拖放3.水平布局4.垂直布局5.修改名字6.转到槽7.实现槽函数 一.总体思路 二.具体操作 1.创建项目 这次咱们一定要勾选Generate form哦。 因为我们要使用设计器进行拖放。 2.粗略拖放 这里用到了复选框&#xff1a;C…

dos命令改3389端口,通过dos命令更改3389端口的操作

要使用DOS命令更改3389端口&#xff0c;通常涉及修改Windows注册表中的相关键值。请注意&#xff0c;直接操作注册表具有一定的风险&#xff0c;因此在进行任何更改之前&#xff0c;请确保您了解正在进行的操作&#xff0c;并已经采取了适当的备份措施。 以下是一个基本的操作步…

Apache Sqoop:高效数据传输工具搭建与使用教程

目录 引言一、环境准备二、安装sqoop下载sqoop包解压文件 三、配置Sqoop下载mysql驱动拷贝hive的归档文件配置环境变量修改sqoop-env.sh配置文件替换版本的commons-lang的jar包 验证Sqoop安装查看Sqoop版本测试Sqoop连接MySQL数据库是否成功查看数据库查看数据表去除警告信息 四…

matlab的imclose()详解

J imclose(I,SE) J imclose(I,nhood) 说明 J imclose(I,SE) 使用结构元素 SE 对灰度或二值图像 I 执行形态学闭运算。形态学闭运算是先膨胀后腐蚀&#xff0c;这两种运算使用相同的结构元素。 J imclose(I,nhood) 对图像 I 执行闭运算&#xff0c;其中 nhood 是由指定结…

开启异步线程的方法

1&#xff0c;开启异步线程&#xff0c;在启动类上加注解&#xff1a; 2&#xff0c;自定义线程池&#xff1a; Configuration public class PromotionConfig {Beanpublic Executor generateExchangeCodeExecutor() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExec…

大模型面试常考知识点1

文章目录 1. 写出Multi-Head Attention2. Pre-Norm vs Post-Norm3. Layer NormRMS NormBatch Norm 4. SwiGLU从ReLU到SwishSwiGLU 5. AdamW6. 位置编码Transformer位置编码RoPEALibi 7. LoRA初始化 参考文献 1. 写出Multi-Head Attention import torch import torch.nn as nn …

【.NET Core】你认识Attribute之CallerMemberName、CallerFilePath、CallerLineNumber三兄弟

你认识Attribute之CallerMemberName、CallerFilePath、CallerLineNumber三兄弟 文章目录 你认识Attribute之CallerMemberName、CallerFilePath、CallerLineNumber三兄弟一、概述二、CallerMemberNameAttribute类三、CallerFilePathAttribute 类四、CallerLineNumberAttribute 类…

Java面试题:ReentrantLock

ReentrantLock 可重入锁 可中断 可以设置超时时间 可以让线程在超时后放弃获取锁 可以设置公平锁 可以实现公平锁或非公平锁 支持多个条件变量 让线程在某些条件下进入等待 和synchronized一样都支持重入 //创建锁对象 ReentrantLock Lock new ReentrantLock(); try…

oracle 9i 行头带有scn的表

oracle 9i 行头带有scn的表 conn scott/tiger drop table t1; drop table t2; create table t1(c varchar2(5)); create table t2(c varchar2(6)) ROWDEPENDENCIES; --t2表每行都有scn,会增加六个字节的开销 alter table t1 pctfree 0; alter table t2 pctfree 0; insert in…

Transformer模型详解03-Self-Attention(自注意力机制)

文章目录 简介基础知识什么是AttentionSelf Attention原理通俗易懂理解矩阵计算Q&#xff0c;K&#xff0c;V计算Self-Attention 的输出 优势 Multi-head self-attention原理通俗易懂理解矩阵计算代码实现 简介 下图是论文中 Transformer 的内部结构图&#xff0c;左侧为 Enco…

十、Redis内存回收策略和机制

1、Redis的内存回收 在Redis中可以设置key的过期时间&#xff0c;以期可以让Redis回收内存&#xff0c;循环使用。在Redis中有4个命令可以设置Key的过期时间。分别为 expire、pexpire、expireat、pexpireat。 1.1、expire expire key ttl&#xff1a;将key的过期时间设置为tt…

SpringBoot自定义初始化sql文件 支持多类型数据库

我在resources目录下有init.sql初始化sql语句 指定sql文件的地址 sql内容如下&#xff1a; /*角色表*/ INSERT INTO #{schema}ccc_base_role (id, create_time, create_user_id, is_delete, role_name, status, update_time, update_user_id) VALUES(b89e30d81acb88448d412…

谷粒商城实战(023 业务-订单模块-页面和幂等性等校验)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第270p-第p283的内容 简介 远程调用的服务已经注册到了注册中心 校验 幂等性校验 拿令牌 读令牌 删令牌 要实现 原子性 在一个事务中 添加令牌…

小红书·电商运营课:小红书开店流程,小红书电商如何运营(18节视频课)

课程目录 第1节课:学习流程以及后续实操流程注意事项 第2节课:小红书店铺类型解析以及开店细节 第3节课:小红书电商运营两种玩法之多品店铺解析 第4节课:小红书电商运营两种玩法之单品店铺解析 第5节课:选品课(多品类类目推荐) 第6节课:选品课(多品类类目推荐) 第7节课:…

以C++为核心语言的高频交易系统是如何做到低延迟的?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「 c的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 问题中限定语言是C&#xff0c;可…