滑动窗口练习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…

【Android面试八股文】Kotlin内置标准函数with的原理是什么?

文章目录 原理和实现方式应用场景总结 with 是 Kotlin 标准库中的一个内置函数&#xff0c;其主要目的是简化对某个对象实例执行多个操作的代码。它的原理和实现方式如下&#xff1a; 原理和实现方式 with的源码定义如下&#xff1a; /*** Calls the specified function [blo…

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

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

GRU基础知识以及相关名词解释

当然&#xff0c;GRU&#xff08;Gated Recurrent Unit&#xff0c;门控循环单元&#xff09;是一种改进的循环神经网络&#xff08;RNN&#xff09;结构&#xff0c;它引入了门控机制来更好地控制信息的流动&#xff0c;从而解决了传统RNN在处理长序列数据时存在的梯度消失和梯…

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: 一款适用于红蓝…

Spring Boot 增删改查(mybatis-plus)

在GitHub上已经开源&#xff0c;有全部源码&#xff0c;有问题可以在GitHub上提问https://github.com/sky41/MySQL.git 1、创建(User) 实体类 package com.my.mysql.entity; import lombok.*; Setter Getter Data NoArgsConstructor //AllArgsConstructor public …

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

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

PCB AVI品质报告采集工具

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

lammps聚合物建模组合技巧

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

什么是分布式架构?

一、分布式架构的概念&#xff1a; 分布式架构是现代软件工程中一个非常核心的概念&#xff0c;特别是在互联网、大数据和云计算领域。分布式架构指的是将一个应用程序分解为多个相互协作的组件或服务&#xff0c;这些组件或服务运行在不同的计算机或服务器上&#xff0c;通常…

【仿真建模-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.挂载格式化后磁盘 挂载成功

CPU 和主板芯片组对应关系

英特尔各代CPU 对应主板芯片组列表 1. 第一代Core&#xff08;Nehalem架构&#xff0c;2008年&#xff09; Core i7/i5/i3&#xff08;LGA 1366/1156&#xff09; 芯片组&#xff1a;X58&#xff08;LGA 1366&#xff09;、P55、H55、H57&#xff08;LGA 1156&#xff09; …

初见DP

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

opencv 视频处理

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