滑动窗口 -(LeetCode 209. 长度最小的子数组、904. 水果成篮)

跟着代码随想录完成了 leetcode 209.长度最小的子数组,学习到了滑动窗口的思想。于是做了904题。

题目意思是,遍历数组,找到包含两种元素的最长子串(字串就包含“连续”之意),返回其长度。因此可以利用滑动数组的思想。

想法过程:

滑动数组的基本实现为:left在左缩小窗口,right(i)遍历数组增大窗口。首先left固定不动,通过right扩大窗口以达到“刚好”满足要求(比如当前字串的和大于target,见209题);然后right固定不动,通过left缩小窗口,达到“极限”,当窗口达到“刚好”不满足要求的边缘条件,就用right扩大窗口。

怎么在滑动左边之后,判断当前水果是两个种类还是一个?可以通过现有的变量left、right、sum(当前遍历过的元素之和)吗?不行。

增加什么变量?变量记录:两个种类v1 v2、及其数量c1 c2。

情况总结:

(1)最开始,c1=c2=0,第一个碰到的就算作第一个种类。v1 = fruits[0]; c1++;
(2)第二步,此时只有一个种类。
fruits[i] 如果与当前水果种类相同,c1++; 如果不同,增加种类v2 = fruits[i]; c2++;
(3)第三步,如果当前水果种类属于v1,v2,对应进行c1++,c2++
……
(4)一直到某个i,fruits[i]不属于当前v1,v2。
此时的窗口长度为 c1+c2。 res = Math.max(res,c1+c2);

=>开始滑动窗口左侧 (left),目的:直到窗口内部只剩下一个种类为止。
把此时的新种类 fruits[i] 增加到 v1或者 v2(主要取决于哪个为零),然后回到第二步,直到跳出for循环。

唉,考虑情况的时候不充分,都是在debug过程中又考虑到了新情况。

错误的点:

(1)除去最开始,c1和才c2可能同时为零吗?=>不可能,窗口左侧极端情况为缩减到只剩一个 ,然后就需要接着往下判断。
[1,1,2],3,4,5
=>1,1,[2],3,4,5
(2)跳出for循环后
res是返回值,最初设定为-1。
目标字串可能在数组首部、尾部、中部(情况等价于① 窗口right小于fruit.length ② 窗口right等于fruit.length-1)。

代码:

(非常的冗余,但运行成功。这里只做记录,不推荐。)

class _Solution904_2 {public int totalFruit(int[] fruits) {int res = -1;int sum = 0;//滑动窗口:要遍历整个数组,求出最大的//怎么在滑动左边之后,判断当前数组是两个种类还是一个?//可以通过现有的变量吗?left right?不行:是无规则的//增加什么变量?两个种类、及其数量int c1=0,c2=0; //记录两个种类的数量int v1= -1,v2=- 1; //记录两个种类int left=0;for(int i = 0; i < fruits.length; i++) {//最开始if(c1 == 0 && c2 == 0) {v1 = fruits[i];c1++;continue;}//除去最开始,c1和c2可能同时为零吗?//=>不可能,假设窗口左侧缩减到只剩一个 ,然后就需要接着扩大窗口。if(c2 == 0 || c1 == 0) { //目前只有一个种类//此时只有一个种类,但不知道哪一个为空。//为什么不知道哪一个为空,//因为 下文滑动窗口左侧缩减直到窗口只剩下一个种类的时候,不知道是v1没了,还是v2没了if(c2 == 0){if(fruits[i] == v1) {c1++;} else {v2 = fruits[i];c2++;}} else if(c1 == 0) {//c2不为空if (fruits[i] == v2) {c2++;} else {v1 = fruits[i];c1++;}}} else {//目前已经有两个种类if(fruits[i] == v1) {c1++;} else if(fruits[i] == v2) {c2++;} else { //当前的fruits[i]不属于v1 v2,需要重新建立窗口res = Math.max(res,c1+c2);//while去掉一个种类while(c1 != 0 && c2 != 0){if(fruits[left] == v1) {c1--;left++;} else if(fruits[left] == v2) {c2--;left++;}}if(c1 == 0) {//去掉一个种类之后,要加上当前 种类v1= fruits[i];c1++;}if(c2 == 0) {v2= fruits[i];c2++;}}}}if(res == -1) {//数组中只有两个种类, 比如fruits = [1,2,1]res=c1+c2;} else { //目标子串有可能是数组末尾 [0,1,2,2]res = Math.max(res,c1+c2);}return res;}
}//end class

改进

(1)上述过程的 v1 v2 c1 c2 其实可以用 HashMap 替代
(2)请品味代码 res = Math.max(res, right-left+1); 的位置。

class Solution {public int totalFruit(int[] fruits) {Map<Integer, Integer> cnt = new HashMap<Integer, Integer>();int left = 0, res = 0;for(int right = 0; right < fruits.length; right++) {cnt.put(fruits[right], cnt.getOrDefault(fruits[right], 0) + 1);while(cnt.size() > 2) {cnt.put(fruits[left], cnt.get(fruits[left])-1);if(cnt.get(fruits[left]) == 0) {cnt.remove(fruits[left]);}left++;}res = Math.max(res, right-left+1);}return res;}
}

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

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

相关文章

Redis(二):常见数据类型:String 和 哈希

引言 Redis 提供了 5 种数据结构&#xff0c;理解每种数据结构的特点对于 Redis 开发运维⾮常重要&#xff0c;同时掌握每 种数据结构的常⻅命令&#xff0c;会在使⽤ Redis 的时候做到游刃有余。 Redis 的命令有上百种&#xff0c;我们不可能全部死记硬背下来&#xff0c;但是…

vue3---自定义插件注册全局对象

① 在src/components文件夹下创建index.ts&#xff1a;用于注册components文件夹下全部的全局组件 // 引入项目中的全部全局组件 import SvgIcon from ./SvgIcon/index.vue import Pagination from ./Pagination/index.vue// 定义全局组件对象&#xff1a;用于存放所有要引入的…

【小白进阶】Linux 调试大法——gdb

初衷 gdb调试是每一个后端开发工程师所必备的技能&#xff0c;我们工作总是会用gdb协助我们去分析和调试问题。但是大部分同学的技能仅停留在最基础的查看问题。即gdb program -->r --> 问题复现 --> bt 查看源码中的哪一行出现了错误。再稍微熟练点的&#xff0c;可能…

配置ssh 免密登录 还是要密码才能登录

确认公钥已经发送到目标服务器 ssh-copy-id 目标ip文件权限验证(id_rsa&#xff0c;id_rsa.pub&#xff0c;authorized_keys&#xff0c;known_hosts) -rw------- #authorized_keys -rw------- #id_rsa -rw-r--r-- #id_rsa.pub -rw-r--r-- #known_hosts.ssh目录权限验证 确…

YoloV5改进策略:RefConv打造轻量化YoloV5利器

文章目录 摘要论文:《RefConv: 重参数化的重聚焦卷积》1、简介2、相关研究2.1、用于更好性能的架构设计2.2、结构重参数化2.3、权重重参数化方法3、重参数化的重聚焦卷积3.1、深度RefConv3.2、普通的RefConv3.3、重聚焦学习4、实验4.1、在ImageNet上的性能评估4.2、与其他重参…

创建对象的方法及一些方法

一、字面量 {} let obj {a:1,b:2} // obj.alet obj1 {a-b:3} //obj1[a-b]let obj2 {1:2,2:3} //obj2[1]//2let s1 Symbol(); let s2 Symbol(); var person { [s1]: "Lily", [s2]: 18, gender: "female" }; console.log(person[s2]); // 输出 18 二…

抖音视频如何无水印下载,怎么批量保存主页所有视频没水印?

现在最火的短视频平台莫过于抖音&#xff0c;当我们刷到一个视频想下载下来怎么办&#xff1f;我们知道可以通过保存到相册的方式下载&#xff0c;但用这种方法下载的视频带有水印&#xff0c;而且有些视频不能保存到相册&#xff08;这是视频作者设置了禁止下载&#xff09;。…

Unity 关于SpriteRenderer 和正交相机缩放

float oldWidth 750f;float oldHeight 1334f;float newWidth Screen.width;float newHeight Screen.height;float oldAspect oldWidth / oldHeight;float newAspect newWidth / newHeight;//水平方向缩放float horizontalCompressionRatio newAspect / oldAspect;//垂直…

IDEA插件推荐

今天给大家推荐一款IDEA插件&#xff1a;Apipost-Helper-2.0&#xff0c;支持三大功能&#xff1a;写完代码IDEA内一键生成API文档&#xff1b;写完代码IDEA内一键调试&#xff1b;生成API目录树&#xff0c;双击即可快速定位API定义的代码…非常好用&#xff01;而且完全免费&…

SELinux零知识学习三十五、SELinux策略语言之角色和用户(6)

接前一篇文章:SELinux零知识学习三十四、SELinux策略语言之角色和用户(5) 三、SELinux策略语言之角色和用户 SELinux提供了一种依赖于类型强制(类型增强,TE)的基于角色的访问控制(Role-Based Access Control),角色用于组域类型和限制域类型与用户之间的关系,SELinux…

找免费4K高清图片素材,就上这6个网站

使用图片素材怕侵权&#xff1f;那就上这6个网站&#xff0c;免费下载&#xff0c;4K高清无水印&#xff0c;赶紧收藏起来~ 1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYxMjky 一个很大的素材库&#xff0c;站内主要还是以设计素材为主&#xff0c;像图片素材就有上百…

免费SSL证书服务——加密通信,零成本体验

你的网站是否安全无忧&#xff1f;我们为你提供免费SSL证书服务&#xff0c;让你的用户数据和信息传输更安全可靠。 安全保障&#xff1a; 全面升级你的网站安全性&#xff0c;通过SSL加密技术&#xff0c;确保用户数据传输隐私无忧。 零成本&#xff1a; 免费SSL证书服务&…

【影刀RPA_写入日期到飞书表格】

飞书将日期写入多维表格&#xff0c;日期格式需要时毫秒级的时间戳才行。

常见面试题-Netty中ByteBuf类

了解 Netty 中的 ByteBuf 类吗&#xff1f; 答&#xff1a; 在 Java NIO 编程中&#xff0c;Java 提供了 ByteBuffer 作为字节缓冲区类型&#xff08;缓冲区可以理解为一段内存区域&#xff09;&#xff0c;来表示一个连续的字节序列。 Netty 中并没有使用 Java 的 ByteBuff…

MySQL主从同步延迟原因与解决方案

一、MySQL数据库主从同步延迟产生的原因 MySQL的主从复制都是单线程的操作&#xff0c;主库对所有DDL和DML产生的日志写进binlog&#xff0c;由于binlog是顺序写&#xff0c;所以效率很高。 Slave的SQL Thread线程将主库的DDL和DML操作事件在slave中重放。DML和DDL的IO操作…

08 木谷博客系统RBAC权限设计

这节内容说一下木谷博客系统的权限设计,采用现在主流的权限模型RBAC,对应关系如下: 以上5张表都在mugu_auth_server这个库中 该部分的服务单独定义在user-boot这个模块中。 将角色、权限对应关系加载到Redis 木谷博客系统在认证中心颁发令牌的时候是将用户的角色保存到令牌…

MySQL用得好好的,为何要转ES?

MySQL是一种关系型数据库&#xff0c;它可以高效地存储和查询结构化的数据。 ES是一种分布式搜索引擎&#xff0c;它可以快速地对海量的非结构化或半结构化的数据进行全文检索和分析。 MySQL 和 ES 的数据存储方式也不同。MySQL 中的数据通常是以关系型表的形式存储在磁盘上&…

PTA:百钱买百鸡 - C/C++ 数组及字符串

题目 我国古代数学家张丘建在《算经》一书中提出了下述数学问题&#xff1a; 鸡翁一值钱五&#xff0c;鸡母一值钱三&#xff0c;鸡雏三值钱一。百钱买百鸡&#xff0c;问鸡翁、鸡母、鸡雏各几何&#xff1f; 请使用三重或者二重循环求解N块钱买N只鸡的问题&#xff1a;计算并…

EOCR-PFZ数码型产品与控制柜主回路的连接方式

上海韩施电气自动化设备有限公司 施耐德EOCR新一代数码型电动机保护器具有体积小、精度高、抗干扰能力强等特点。为方便安装&#xff0c;EOCR数码型产品与控制柜主回路的连接具有多种方式&#xff0c;分别是&#xff1a;窗口型、贯穿性和端子型。 窗口型&#xff08;韩施电气…