滑动窗口练习1-长度最小的子数组

1.题目链接:209.长度最小的子数组

2.题目描述:

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

进阶:

  • 如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。

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

算法思路:

「从前往后」枚举数组中的任意一个元素,把它当成起始位置。然后从这个「起始位置」开始,然后寻找一段最短的区间,使得这段区间的和「大于等于」目标值。

将所有元素作为起始位置所得的结果中,找到「最小值即可」

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

4.解法二(滑动窗口):

算法思路:

由于此问题分析的对象是「一段连续的区间」,因此可以考虑「滑动窗口」的思想来解决这道题。

让滑动窗口满足:从 i 位置开始,窗口内所有元素的和小于 target (那么当窗口内元素之和第一次大于等于目标值的时候,就是 i 位置开始,满足条件的最小值)

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

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

  • 如果窗口内元素之和不满足条件:right++ ,另下一个元素进入窗口。

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

为什么滑动窗口可以解决问题,并且时间复杂度更低?

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

  2. 我们既然已经找到 left1 开始的最优的区间,那么就可以大胆舍去 left1 。但是如果继续像方法一一样,重新开始统计第二个元素( left2 )往后的和,势必会有大量重复的计算(因为我们在求第一段区间的时候,已经算出很多元素的和了,这些和是可以在计算下次区间和的时候用上的)。

  3. 此时,right1 的作用就体现出来了,我们只需将 left1 这个值从 sum 中剔除。从 right1 这个元素开始,往后找满足 left2 元素的区间(此时 right1 也有可能是满足的,因为 left1 可能很小。sum 剔除 left1 之后,依旧满足大于等于 target )。这样我们就能省掉大量重复的计算

  4. 这样我们不仅能解决问题,而且效率也会大大提升

时间复杂度:虽然代码是两层循环,但是我们的 left 指针和 right 指针都是不回退的。两者最多都往后移动 n 次。因此时间复杂度是 O(N)。

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int len = INT_MAX;int n = nums.size();int sum = 0;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;}
};

 

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

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

相关文章

聊聊分布式集群的基本概念

在当前主流的分布式架构中,各种各样的集群技术几乎成了任何想要提升系统稳定性和处理能力的团队的必备技能。虽然各种中间件和系统都有让人看似眼花缭乱的集群实现方案,但其背后仍然逃不过一些核心的技术概念,我会结合几个我比较熟悉的中间件,简单聊一下我对集群的理解: …

zlib安装教程(Windows)

开源项目地址&#xff1a;madler/zlib: A massively spiffy yet delicately unobtrusive compression library. (github.com) 下载代码 可以选择git clone 或直接下载release包 Releases madler/zlib (github.com) git clone https://github.com/madler/zlib.git release…

被拷打已老实!面试官问我 #{} 和 ${} 的区别是什么?

引言&#xff1a;在使用 MyBatis 进行数据库操作时&#xff0c;#{} 和 ${} 的区别是面试中常见的问题&#xff0c;对理解如何在 MyBatis 中安全有效地处理 SQL 语句至关重要。正确使用这两种占位符不仅影响应用的安全性&#xff0c;还涉及到性能优化。 题目 被拷打已老实&…

2024-06-19,面试官问的问题

文章目录 1、采用minIO完成了图片存储&#xff0c;采用阿里云OSS服务器存储图片这两个功能面试官理解为重复&#xff0c;面试官又问minIO怎么同步到OSS&#xff1f;2、讲一下ThreadLocal&#xff1f;3、为什么用ThreadLocal存数据&#xff1f;4、redis有几种数据结构&#xff1…

零成本!无需服务器,搭建你的图床!

先给大家看看成品&#xff1a; 访问地址&#xff1a;http://cp64mba5g6h48vl4is50.app.memfiredb.cn/ 这是我花十分钟做出来的零成本&#xff0c;不需要服务器的图床&#xff0c;不需要登录&#xff0c;任何人都可以在上面上传图片和拿到图片链接去使用&#xff0c;当然这只…

【Java面试】二十一、JVM篇(中):垃圾回收相关

文章目录 1、类加载器1.1 什么是类加载器1.2 什么是双亲委派机制 2、类装载的执行过程&#xff08;类的生命周期&#xff09;3、对象什么时候可以被垃圾回收器处理4、JVM垃圾回收算法4.1 标记清除算法4.2 标记整理算法4.3 复制算法 5、分代收集算法5.1 MinorGC、Mixed GC、Full…

大数据的发展,带动电子商务产业链,促进了社会的进步【电商数据采集API接口推动电商项目的源动力】

最近几年计算机技术在诸多领域得到了有效的应用&#xff0c;同时在多方面深刻影响着我国经济水平的发展。除此之外&#xff0c;人民群众的日常生活水平也受大数据技术的影响。 在这其中电子商务领域也在大数据技术的支持下&#xff0c;得到了明显的进步。虽然电子商务领域的发…

网页钓鱼-克隆修改--劫持口令下载后门

免责声明:本文仅做技术交流与学习... 目录 1-右键另存为 2-goblin项目(不推荐) 修改goblin.yaml文件 运行exe ​编辑 3-Setoolkit (kali自带) 网页克隆---> 1-右键另存为 --不行就再定位元素进行修改. 2-goblin项目(不推荐) GitHub - xiecat/goblin: 一款适用于红蓝…

云原生安全联防联抗策略玩转微隔离

前言 随着信息技术的发展、互联网的快速普及&#xff0c;越来越多的信息被存储在云端&#xff0c;企业面临的安全问题也日益突出。在《网络安全法》、《数据安全法》等多部法律法规要求下&#xff0c;各行业用户纷纷设立安全部门。不管安全部门里是“一人当关”还是“三三两两…

PCB AVI品质报告采集工具

AVI设备,品质报告. 可以通过: 过滤文件名指定文件名 排除多余的日志;运行日志为增量日志,可采用增量模式;品质报告可设置采集后删除; 下载: Gitee下载 最新版本 优势: A. 开箱即用. 解压直接运行.不需额外安装. B. 批管理设备. 设备配置均在后台管理. C. 无人值守 客户端自…

lammps聚合物建模组合技巧

大家好,我是小马老师。 本文介绍聚合物结构的组合问题。 在lammps模拟中,聚合物模拟应该算是比较复杂的一种模拟,不仅建模复杂、势参数较多,而且在模拟过程中也会经常出现各种意想不到的错误。 本文主要解决聚合物建模过程中常遇到的一个问题:多成分的组合。 比如下面的结…

【仿真建模-anylogic】Port原理解析

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-14 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 类图 2. 原理解析 2.1 核心函数&#xff1a; Port作为各类型端口的基类&#xff0c;其核心方法如下 &#xff1a; 函数功能Port(A…

Linux磁盘格式化与重新分区

1.df -BG查看磁盘挂载情况 2.fdisk -l查看磁盘详细信息 3.sudo mkfs.ext4 /path 格式化磁盘 4.挂载格式化后磁盘 挂载成功

初见DP

线性DP 例题1 1143. 最长公共子序列 &#xff08;LCS&#xff09; 子序列不连续 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#x…

opencv 视频处理

概述 OpenCV 的视频模块是其核心组成部分之一&#xff0c;主要负责视频文件的读取、处理、分析以及视频流的捕获和输出。这一模块使得开发者能够轻松地处理来自摄像头、文件或其他视频源的视频数据&#xff0c;进行实时或离线的图像处理和计算机视觉任务。以下是 OpenCV 视频模…

Pentest Muse:一款专为网络安全人员设计的AI助手

关于Pentest Muse Pentest Muse是一款专为网络安全研究人员和渗透测试人员设计和开发的人工智能AI助手&#xff0c;该工具可以帮助渗透测试人员进行头脑风暴、编写Payload、分析代码或执行网络侦查任务。除此之外&#xff0c;Pentest Muse甚至还能够执行命令行代码并以迭代方式…

Excel 找出最大值及其相邻的 N 个成员

某列都是数值&#xff1a; A1132213464215496973482396101113712491342144015151631171718114719182030212222423252419251326272738283029163012312332333233419351436463723383739384028 请找出最大值及其相邻的 10 个成员&#xff0c;注意越界检查&#xff0c;实际符合条件…

JAVA云HIS医院管理系统源码:可医保对接的云HIS运维平台源码 SaaS模式

JAVA云HIS医院管理系统源码&#xff1a;可医保对接的云HIS运维平台源码 SaaS模式 云HIS系统运用云计算、大数据、物联网等新兴信息技术&#xff0c;为医疗机构提供全面的医疗信息管理服务。该系统支持医保功能&#xff0c;通过与医保系统的对接&#xff0c;实现了医疗费用的自…

Boost 网络库

asio 网络编程的基本流程创建 socket绑定acceptor连接指定的端点服务器接受连接 网络编程的基本流程 服务端 1&#xff09;socket----创建socket对象。 2&#xff09;bind----绑定本机ipport。 3&#xff09;listen----监听来电&#xff0c;若在监听到来电&#xff0c;则建…

Vue 3的组合式API:你真的需要它吗?

Vue 3的组合式API&#xff1a;你真的需要它吗&#xff1f; 随着Vue 3的发布&#xff0c;我们迎来了一个新的API——组合式API&#xff08;Composition API&#xff09;。这个API为开发者提供了更灵活、更可复用的代码编写方式。然而&#xff0c;传统的选项式API&#xff08;Opt…