代码随想录--数组--滑动窗口解决最长/短子数组题型

news2024/10/2 3:18:32

注意题目是说找连续数组的和>=s的最小长度,是“和”,不然都不知道题目在说什么。

http://【拿下滑动窗口! | LeetCode 209 长度最小的子数组】 https://www.bilibili.com/video/BV1tZ4y1q7XE/?share_source=copy_web

看一下暴力算法,暴力算法是用两个for循环,一个循环起始位置,一个循环终止位置。进入第一个循环起始位置固定,然后进入第二个循环终止位置遍历数组去寻找>=s的数组,然后再进入第一个循环起始位置移动,终止位置再遍历数组去寻找此位置为起始位置的和>=s的数组,如此下去。

接下来是滑动窗口,滑动窗口其实和双指针有点相似,滑动窗口方法用一个for循环解决暴力算法中两个for循环。

首先要弄清楚:

①滑动窗口的for循环里for(j..)循环的j指的是起始位置还是终止位置?

假设是起始位置,那为了寻找出和>=s的数组,终止位置就需要遍历数组,那起始位置每移动一个,终止位置就得遍历一遍数组,那就和暴力算法一样了需要两个循环,那就不是滑动窗口了。

所以这里要注意,这个循环的i指的是终止位置。

②那起始位置应该怎么动什么时候应该移动?这个是滑动窗口里很重要的。

for循环,终止位置不断往右移动,当起始位置和终止位置之间的数组和>=s,起始位置就得往右移动了,为什么?

因为如果起始位置还不动,而终止位置继续往右移动,因为此时这道题数组里是正数,所以长度肯定越来越大,可是我们要找的是最短长度啊,所以这样是无意义的嘛。所以此时应该是终止位置暂时别动,起始位置往后移动,因为此时有可能出现这种情况:s=100,然后你此时窗口是[4,2,98],这里面还有更短的[2,98],所以此时起始位置应该往后移动去寻找这个窗口里的更短数组。

③有个小细节要注意,让起始位置往右移的时候是用if还是while呢?

因为有可能出现这种情况,你当前窗口为[2,2,2,2,2,98],如果是if,那你起始位置移动到第二个2就停下来了,然后接着跳出循环继续终止位置右移的循环,可是你起始位置只移动一位[2,2,2,2,98]这个并不是我们要的最短长度啊,所以应该是用while,让起始位置不断往后移直至找到最短长度。

④那找出各位置的最短数组后,有这么多数组,哪个才是最短的?

就像伪代码里的,你定义一个东西记录当前的最短长度,然后每次找到一个最短长度时就和那个最短长度比较,用min()留下最短的长度嘛。

滑动窗口的套路一般是这样的:

i=0;

for(j=0;j<=nums.size){

sum+=nums[j];  //sum是记录窗口里的和

while(sum>=s){

       sub=j-i-1;  //sub是记录当前窗口长度

       result=min(result,sub);  //就选出最短的那个长度

       sum=sum-nums[i];  //起始位置移动了窗口的和就减少了嘛

       i++;

   }

return result;

}

这里的时间复杂度是O(n)而不是O(n^2),不要以为for里面放一个while就以为是O(n^2),主要是看每个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是2*n也就是O(n),空间复杂度是O(1)

练习题:

①leetcode 209.长度最小的子数组(就是以这道题为例的)

②leetcode 904.水果成篮

这道题和上一道题有什么区别?区别在于上面那道题求的是最小滑动窗口,而本题求的是最大滑动窗口。最小滑动窗口和最大滑动窗口有什么不一样吗?

关键的区别在于,最小滑动窗口是在左边界右移的过程中更新结果(因为要找最短的情况嘛),是在左边界右移的循环内更新结果,为什么?因为你求的是最短长度嘛,左边界右移就在不断变短呀所以就要不断更新你的结果呀;  最大滑动窗口是在右边界右移的过程中更新结果(因为要找最长的情况嘛),是在右边界右移的循环内(左边界右移循环外)更新结果,为什么?因为你求的是最长长度嘛,右边界右移就在不断变长呀所以就要不断更新你的结果呀。

上道题是求和,所以定义个sum加和即可;这道题是限定只能有两种果类,所以可以考虑用哈希表,哈希表记录目前窗口出现的数及其出现的次数,也可以直接定义一个数组cnts来记录当前窗口出现的数及其出现的次数。

思路大致就是,定义left,right,做循环右指针往右移,统计每种数及其出现的次数,当出现哈希表.size()>2即需要进入循环让左指针往右移动,直至把其中某个数的出现次数变为0,即删除它,最终使得里面的数只有两种或者两种以下。(目前对哈希表都陌生了)

③leetcode 76.最小覆盖子串

这道题不是很透

http://【【LeetCode 每日一题】76. 最小覆盖子串 | 手写图解版思路 + 代码讲解-哔哩哔哩】 https://b23.tv/isdKQKf

这位答主的挺好,只是我还是有点不明白如果有D、E这种字母那咋弄的?此时hs[D]=1,可是ht[D]不存在呀,不存在就直接不理了吗因为没有满足if(hs[s[i]]<=ht[s[i]]),所以直接加入窗口就不用管了。反正长度可以直接i-j+1。

答主思路应该是这样: 定义两个哈希表,一个记录字符串t出现的字母以及其出现次数即ht,一个当前滑动窗口出现的字母及其出现次数即hs。然后定义一个cnt记录有效字符,注意什么是有效字符,s的下标为i的字符加入到hs中后,hs[s[i]]<=ht[s[i]] 才算有效字符,如ht里1个A,当前滑动窗口里就一个A那这个A就是有效字符,比如滑动窗口为[BAADC]而ht[]里就要一个A,所以B和第二个A就不是有效值了,到第一个A的时候就满足cnt=t.length了,左边界就可以右移找出当前窗口的最短长度了。

l=0,r=0,每次循环都有三步动作:

第一步是把当前数值加入到窗口中即hs[s[r]]++,如果加入后没有超过ht中该数值的数量即hs[s[r]]<=ht[s[r]],则说明该字符是一个有效字符,我们就要把cnt值+1,

第二步是因为我们已经在窗口中加入了一个新的字符,所以左侧可能存在冗余字符要删去,当hs[s[l]]>ht[s[l]],意思就是多余了,即做循环左边界往右移,如[ABAC]找AC,到ABA时,因为只要一个A,所以到第二个A时,左边界就往右移动,而B也是冗余的,所以再继续移动,所以是用循环while而不是if.

第三步是窗口已经移动完整,如果cnt值等于字符串t的长度,就说明窗口中已经覆盖了t中所有的字符,只要根据窗口长度(i-j+1)更新结果字符串就可以了。

 

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

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

相关文章

android 卡顿、ANR优化(1)屏幕刷新机制

前言&#xff1a; 本文通过阅读各种文章和源码总结出来的&#xff0c;如有不对&#xff0c;还望指出 目录 正文 基础概念 视觉暂留 逐行扫描 帧 CPU/GPU/Surface&#xff1a; 帧率、刷新率、画面撕裂 画面撕裂 Android屏幕刷新机制的演变 单缓存&#xff08;And…

限流算法详解

限流是我们经常会碰到的东西&#xff0c;顾名思义就是限制流量。它能保证我们的系统不会被突然的流量打爆&#xff0c;保证系统的稳定运行。像我们生活中&#xff0c;地铁就会有很多护栏&#xff0c;弯弯绕绕的&#xff0c;这个就是一种限流。像我们抢茅台&#xff0c;肯定大部…

案例17-环境混用带来的影响

目录一、背景介绍背景事故二、思路&方案三、过程四、总结nginx做转发fastdfs&#xff08;文件上传下载&#xff09;五、升华一、背景介绍 本篇博客主要介绍开发中项目使用依赖项环境闭一只带来的恶劣影响&#xff0c;在错误中成长进步。 背景 本公司另外一个产品开发God…

爱因斯坦求和约定 含代码einsum

目录 一、简介 1.哑标 2.自由标 二、torch实现 1.计算迹 2.取矩阵对角线 3.计算外积 4.batch矩阵乘法 5.带有子列表和省略号 一、简介 爱因斯坦求和约定(Einstein summation convention)是一种标记的约定, 又称为爱因斯坦标记法(Einstein notation), 可以基于一些约定…

position:absolute详解

position:absolute详解 日常开发中&#xff0c;经常会涉及元素的定位&#xff0c;我们都知道&#xff0c;绝对定位相对于最近position不为static的父级元素来定位&#xff0c;但其中定位的位置还是有细微的差别的。 绝对定位根据left和top属性来规定绝对定位元素的位置。 基…

2023年前端面试题集锦

2023年又是行情惨淡的一年&#xff0c;为此我从 「枇杷村IT面试宝典」小程序里收集了一些题目&#xff0c;更多题目可以扫下方二维码查看 现做个总结如下&#xff1a; 1. 在JavaScript中, 0 -0的结果是什么&#xff1f; 结果为true&#xff01; 严格等于比较的是值和类型&…

tcpdump写文件-w文件大小为0字节问题处理

一同事找来&#xff0c;说用tcpdump在一台linux服务器上抓包写文件&#xff0c;文件大小为0&#xff0c;不知道是什么原因造成&#xff0c;让协助解决。 自己登陆服务器试了一下&#xff0c;发现问题确实如此 不用-w&#xff0c;让打印在平面上&#xff0c;发现正常 以为权限不…

虹科案例 | 如何可持续的对变压器进行温度监控?

为了延长变压器的使用寿命&#xff0c;需要一个测量系统来监测内部整个绕组区域的温度。它必须明确温度升高发生的位置及其强度。您可以在此处了解为什么会这样以及如何在实践中实施? PART 1 变压器多点测温问题 变压器的工作温度越高&#xff0c;使用寿命越短。这里主要存在…

C++核心知识(五)—— 继承和派生

1. 继承概述1.1 为什么需要继承网页类 class IndexPage{ public://网页头部void Header(){cout << "网页头部!" << endl;}//网页左侧菜单void LeftNavigation(){cout << "左侧导航菜单!" << endl;}//网页主体部分void MainBody(){…

[SQL Statements] 基本的SQL知识 之DDL针对表结构和表空间的基本操作

[SQL Statements] 基本的SQL知识 之DDL针对表结构和表空间的基本操作 什么是数据库的表以及表空间 在MySQL中&#xff0c;一个数据库可以包含多个表&#xff0c;每个表是由若干个列&#xff08;column&#xff09;和行&#xff08;row&#xff09;组成的。表是存储数据的基本…

2023年clang12编译问题与解决的记录

最近编译clang12以及尝试基于clang开发一个C的静态代码分析工具&#xff0c;如下是遇到的环境相关的编译问题与解决方案。在此做个记录&#xff0c;同时供可能会遇到同样问题的同学参考 环境说明 注&#xff1a;如下是最终编译成功的环境 clang分支&#xff1a; branch : a…

HTTP 请求头中的 Remote_Addr,X-Forwarded-For,X-Real-IP | Spring Cloud 13

一、$remote_addr 表示发出请求的客户端主机的 IP 地址&#xff0c;但它的值不是由客户端提供的&#xff0c;而是Nginx与客户端进行TCP连接过程中&#xff0c;获得的客户端的真实地址 IP 地址&#xff0c;REMOTE_ADDR 无法伪造&#xff0c;因为建立 TCP 连接需要三次握手&…

Java学习教程,Java基础教程(从入门到精通)

Java 是一门面向对象编程语言&#xff0c;不仅吸收了 C 语言的各种优点&#xff0c;还摒弃了 C 里难以理解的多继承、指针等概念。Java 不但可以用来开发网站后台、PC 客户端和 Android APP&#xff0c;还在数据分析、网络爬虫、云计算领域大显身手。 从学术的角度讲&#xff…

VR全景云展厅,实现7*24小时的线上宣传能力!

数字化时代&#xff0c;虚拟现实技术的应用越来越广泛&#xff0c;其中VR全景云展厅是一种新兴的展示方式&#xff0c;具有独特的展示优势。随着VR技术的不断发展&#xff0c;越来越多的企业、机构和个人开始使用VR全景云展厅来展示他们的产品和服务。一、展厅营销痛点1、实地到…

内网渗透-基础环境

解决依赖&#xff0c;scope安装 打开要给cmd powershell 打开远程 Set-ExecutionPolicy RemoteSigned -scope CurrentUser; 我试了好多装这东西还是得科学上网&#xff0c;不然不好用 iwr -useb get.scoop.sh | iex 查看下载过的软件 安装sudo 安装git 这里一定要配置bu…

105.第十九章 MySQL数据库 -- MySQL半同步复制、复制过滤器、复制的问题和解决方案(十五)

6.1.6 半同步复制 Mysql的主从复制它的复制机制我们称为所谓的异步复制,这里面提到了一个概念异步,那什么叫异步复制呢,所谓异步复制实际上说白了就是在用户发请求到数据库做一些修改的时候,那我们在前面讲过主从复制,如果我们有一个主节点,另外带若干个从节点,假设有2个…

Typescript 全栈最值得学习的技术栈 TRPC

如果你想成为一个 Typescript 全栈工程师&#xff0c;那么你可能需要关注一下 tRPC 框架。本文总共会接触到以下主要技术栈。Next.jsTRPCPrismaZodAuth.js不是介绍 tRPC 吗&#xff0c;怎么突然出现这么多技术栈。好吧&#xff0c;主要这些技术栈都与 typescript 相关&#xff…

知道一个服务器IP应该怎么进入

首先我是国内&#xff0c;访问国外的网站比如谷歌等&#xff0c;访问特别慢&#xff0c;有时候甚至登录不进去。现在知道了一个台湾或者国外的服务器应该怎么登录进去呢&#xff1f;知道服务器IP之后&#xff0c;你还需要知道服务器的远程端口帐号密码才能登录的。知道上面信息…

Java 19和IntelliJ IDEA,如何和谐共生?

Java仍然是目前比较流行的编程语言&#xff0c;它更短的发布节奏让开发者每六个月左右就可以试用新的语言或平台功能&#xff0c;IntelliJ IDEA帮助我们更流畅地发现和使用这些新功能。IntelliJ IDEA v2022.3正式版下载(Q技术交流&#xff1a;786598704&#xff09;在本文中&am…

小樽C++ 多章⑧ (叁) 指针与字符串、(肆) 函数与指针

目录 叁、函数与字符串 肆、函数与指针 4.1 指针作为函数参数 4.2 函数返回指针 4.3 函数指针与函数指针数组 4.4 结构体指针 ​​​​​​​​​​​​​​小樽C 多章⑧ (壹) 指针变量https://blog.csdn.net/weixin_44775255/article/details/129031168 小樽C 多章⑧ …