【C++算法】9.滑动窗口_长度最小的子数组

news2024/11/23 16:28:35

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:
    • 图解


题目链接:

209. 长度最小的子数组


题目描述:

1170422f911c06f1e598ea59a29ecac5


解法

解法一:暴力求解(会超时)

暴力枚举出所有子数组的和。

查找子数组n2,求和n

一共O(n3)

优化:

求和的时候,可以把上次求和的结果存起来,往后加一位的时候直接把那一位的值加到上次的和里面。

解法二:滑动窗口O(n)

利用单调性,使用同向双指针来优化。(同向双指针也叫滑动窗口)

  1. left=0,right=0,标记窗口的左右端点
  2. 进窗口
  3. 判断,更新结果🌟,出窗口

2-3步是一直循环的

例如:nums=[2,3,1,2,4,3]

bf6f7a41e4c0f24e3385c0f646767131

移动到sum>=target

6534792b2aa1723748d3fa03cddf0bc9

然后left右移,因为如果left不动,right继续往后得到的都不是长度最小的数组了。

aa3c1e36590f6a910fb325c20970fa2b

sum<target,right右移

98dad4dddeee070163985dcba31f6609

依次类推

然后窗口的长度可以用len来记录,每次判断后先更新结果,然后出窗口。


C++ 算法代码:

解法一:暴力求解(会超时)

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;
    }
};

解法二:

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;
    }
};

图解

nums=[2,3,1,2,4,3]

target=7

  1. n=6,sum=0,right=0,left=0,target=7,len=INT_MAX(确保min使用的时候不会把len的初始值当作最小值)

b000e57b75676632dd08955353dcf5f6

  1. sum=2

    sum<target,right++

a26691d21d504806c3bd541f0e84a510

  1. sum=5

    sum<target,right++

88c4dd7832bfdeb9cbaf7889c41dbef0

  1. sum=5

    sum<target,right++

216734ef9302afa8c1e63071380c329f

  1. sum=8

    sum>target,len=4

    sum=sum-nums[left++]=8-2=6

ed97423f50bce4cfa4726e06b66751e7

  1. sum=6

    sum<target,right++

d055ae3daef5ce1fefa302efca207622

  1. sum=10

    sum>target,len=4

    sum=sum-nums[left++]=10-3=7

d80a4ad69c27c089f1261afef6455762

  1. sum=7

    sum=target,len=3

    sum=sum-nums[left++]=7-1=6

973a3fe82a527723d2848853fb0f99cb

  1. sum=6

    sum<target,right++

5b759f03d0c01c3cc4abdd5a1c2a8892

  1. sum=9

    sum>target,len=3

    sum=sum-nums[left++]=9-2=7

328afb03c2ae215109c04c4becc5ddbe

  1. sum=7

    sum=target,len=2

    sum=sum-nums[left++]=7-4=3

bd5301b2ad254ec8435695ecc4437004

  1. sum=3

    sum<target,right++

cc49d00b9fff8a978d8ef4972098214c

  1. 跳出for循环,return len == INT_MAX ? 0 : len;,这里返回2

  2. 程序结束

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

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

相关文章

【hot100-java】K 个一组翻转链表

链表篇 参考题解 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ …

文件传输遗漏

查看失败的 Failed to transfer file ‘E:\m3dmpre\datasets\mvtec3d\foam\train\good\xyz\184.tiff’. Could not close the output stream for file “sftp://172.29.6.20/home/cszx/zgp/datasets/mvtec3d/foam/train/good/xyz/184.tiff”. 将faild的全部重传一遍

知识二: 马尔科夫决策过程

强化学习从入门到精通&#xff08;马尔科夫决策过程&#xff09;&#xff08;7天入门强化学习&#xff09; 知识二&#xff1a;马尔科夫决策过程 先介绍马尔可夫过程&#xff08;Markov process&#xff09;以及马尔可夫奖励过程&#xff08;Markov reward process&#xff0…

matlab不小心删除怎么撤回

预设项——>删除文件——>移动至临时文件夹 tem临时文件夹下

中级软考-软件设计师重要性与含金量以及就业方向(文末分享考试真题与笔记)

中级软考软件设计师在中国IT行业中具有重要的地位和高含金量&#xff0c;特别是在以下几个方面&#xff1a; 重要性与含金量 职业认可&#xff1a;该证书是国家认可的&#xff0c;证明持证人具备一定的软件设计和开发能力&#xff0c;对求职者在招聘市场上具有较强的竞争力。 …

如何在 iPad 上恢复已删除的历史记录?

iPad 配备了一个名为 Safari 的内置网络浏览器。这是一种在旅途中保持联系和浏览网页的强大且便捷的方式。但如果您不小心删除了浏览历史记录&#xff0c;则尝试恢复它可能会很令人沮丧。 幸运的是&#xff0c;您可以通过多种方法在 iPad 上恢复已删除的 Safari 历史记录。您应…

匹配全国地址的正则表达式工具类

正则表达式&#xff0c;匹配全国五级地址工具类&#xff0c;可以直接放在项目中使用~ 1级&#xff1a;国 &#xff08;可忽略不填&#xff09; 2级&#xff1a;**省、**自治区、**直辖市、**特别行政区、&#xff08;四个直辖市可忽略不填&#xff09; 3级&#xff1a;**市、**…

低代码和零代码开发方式如何改变软件开发行业?

低代码和零代码开发方式如何改变软件开发行业&#xff1f; 随着技术的进步和数字化转型的加速&#xff0c;软件开发行业正在经历一场革命。在这场革命中&#xff0c;低代码和零代码平台正逐渐成为企业开发应用的重要工具。它们以其简单易用的特性&#xff0c;极大地降低了软件…

面试笔记-js基础篇

1、因为在 JS 的最初版本中&#xff0c;使用的是 32 位系统&#xff0c;为了性能考虑使用低位存储了变量的类型信息&#xff0c;000 开头代表是对象&#xff0c;然而 null 表示为全零&#xff0c;所以将它错误的判断为 object 。虽然现在的内部类型判断代码已经改变了&#xff…

计算机网络第1章(概述)万字笔记详细版

1.1、计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成为一种重要的信息服务基础设施计算机网络已经像水&#xff0c;电&#xff0c;煤气这些基础设施一样&#xff0c;成为我们生活中不可或缺的一部分 我国互联网发展状况 中国互联网络信息中心CNNIC 1.2、…

万字详解AI实践,零手写编码用AI完成开发 + 数据清洗 + 数据处理 的每日新闻推荐,带你快速成为AI大神

用AIdify完成前后端开发数据处理和数据清洗。 引言数据获取和数据处理dify构建workflow进行数据清洗前端页面构建和前后端交互总结 引言 AI时代对开发人员的加强是非常明显的&#xff0c;一个开发人员可以依靠AI横跨数个自己不熟悉的领域包括前后端、算法等。让我们来做个实践…

模板和静态文件

模板和静态文件 1、templates模板2、静态文件2.1、static目录2.2、引用静态文件 1、templates模板 "templates"目录用于存放模板文件&#xff0c;通常是用于动态生成页面的文件。 在app01目录下创建templates文件夹&#xff0c;html文件均保存在templates中 在urls.p…

Linux的hadoop集群部署

1.hadoop是一个分布式系统基础架构,主要解决海量数据额度存储与海量数据的分析计算问题 hdfs提供存储能力,yarn提供资源管理能力,MapReduce提供计算能力 2.安装 一:调整虚拟机内存,4G即可 二:下载安装包 网址:https://mirrors.aliyun.com/apache/hadoop/common/hadoop-3.4.0/…

【文心智能体 AI大师工坊】『​​​​​​​人间夸夸机』情感类智能体开发调优全过程详解

&#x1f680;『人间夸夸机』点击前往体验&#xff1a;https://snhoio.smartapps.baidu.com/?_swebScene3611000000000000 最近参加了百度文心智能体平台AI大师工坊&#x1f389;活动&#xff0c;在这个活动中&#xff0c;我利用文心平台提供的各种插件、大模型等工具&#xf…

Linux内核USB3.0驱动框架分析--USB主机控制器hcd驱动分析

一&#xff0c;概述 usb主机控制器驱动一般以platform的形式将驱动注册进内核&#xff0c;&#xff0c;因此我们需要从前面一篇文章的框图说起。主要分析下图中橙色部分的内容。 二&#xff0c;usb主机控制器相关函数 2.1 usb_create_hcd 我们来看一下usb_create_hcd函数&a…

如何成为 Rust 核心贡献者?Rust 开发的核​​心是什么?Rust 重要技术专家揭秘

10 月 17 - 18日&#xff0c;由 GOSIM 开源创新汇主办、CSDN 承办的 GOSIM CHINA 2024 将在北京盛大启幕。作为 GOSIM 开源年度大会的第三届盛会&#xff0c;本次活动邀请了 60 多位国际开源专家&#xff0c;汇聚了来自全球百余家顶尖科技企业、知名高校及开源社区的技术大咖、…

图像增强论文精读笔记-Kindling the Darkness: A Practical Low-light Image Enhancer(KinD)

1. 论文基本信息 论文标题&#xff1a;Kindling the Darkness: A Practical Low-light Image Enhancer 作者&#xff1a;Yonghua Zhang等 发表时间和期刊&#xff1a;2019&#xff1b;ACM MM 论文链接&#xff1a;https://arxiv.org/abs/1905.04161 2. 研究背景和动机 现有…

C++入门基础知识110—【关于C++ if...else 语句】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C if...else 语句的相关内容&#xff01…

SAP SD学习笔记09 - 受注传票中的不完全Log 和 Business Partner(取引先机能)

好久没写SD了&#xff0c;今天继续写。 上一章讲了SD的如下知识 - SD的售前的流程&#xff08;引合和見積&#xff08;询价和报价&#xff09;&#xff09; - 数据流的概念&#xff0c;主要就是后传票可以参照前传票&#xff0c;以实现数据的流动&#xff0c;减少输入 - Co…

PHP游泳馆会员管理系统-计算机毕业设计源码86627

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于游泳馆会员管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了游泳馆会员管理系统&#xff0c;它彻底改…