【算法】滑动窗口——水果成篮

本篇博客是我对“水果成篮”这道题由暴力解法到滑动窗口思路的具体思路,有需要借鉴即可。

目录

  • 1.题目
  • 2.暴力求解
  • 3.暴力优化
    • 3.1每次right不用回退
    • 3.2有些left长度一定不如前一个,不用走,left不回退
  • 4.滑动窗口算法
  • 5.总结

1.题目

题目链接:LINK

在这里插入图片描述

这道题,题干很长,大概意思是给你一个数组,然后你可以从随便一个数字开始依次遍历,直到遍历结束或者找到超过不同的两个数字,问你最大长度是几。

一般没有经验的人,肯定首先想到的是暴力求解,我也是一样哈,没啥经验。

2.暴力求解

那如何进行暴力求解呢?
暴力求解思路:哈希表 + 依次遍历

思路详解:具体来说,定义两个指针,一个left,一个right,再搞一个哈希表,right指向的数字就丢到哈希表里,计数,然后超过两个或者遍历结束的时候,我们更新一下结果然后left++,right = left,重新计数。然后这堆记的数字取个最大的就行了。

总而言之,代码如下:

class Solution {
public:
//暴力解法:int totalFruit(vector<int>& fruits) {int n = fruits.size();int count = 0;int ret = 0;int sum = 0;for(int left = 0;left < n;left++){count = 0;sum = 0;int hash[100001] = {0};for(int right = left;right < n;right++){//进哈希表if(hash[fruits[right]] == 0)//一个新种类的水果{hash[fruits[right]]++;count++;sum++;}else//这里标识之前有过的一个水果{hash[fruits[right]]++;sum++;}if(count > 2){ret = max(ret, sum - 1);break;}if(count <= 2 && right == n - 1){ret = max(ret, sum);break;}}}return ret;}
};

然后不出意外哈,力扣绝对过不了,不然这题不会上中等难度了。

然后力扣提示说超出时间限制,比如下图:
在这里插入图片描述

所以说,这道题肯定是可以优化的,那具体怎么优化呢?我们一步一步来。

3.暴力优化

3.1每次right不用回退

这是什么意思呢?如下图所示:
在这里插入图片描述
在left固定的情况下,之后right这个地方数字种类超过2了,那么意思是红色这块区域数字种类个数是2,这时候按照暴力求解的方式,left++,right = left。

但是,我想说绿色的这块区域的数字种类会有可能超过2吗?显然这是不可能的,所以说right压根没有回去的必要。

3.2有些left长度一定不如前一个,不用走,left不回退

再比如说哈,如下图所示:
在这里插入图片描述
left = 2的情况下压根没必要去走好吧~~
在这里插入图片描述

行了,这时候我就发现这个题目经过优化之后满足“滑动窗口”的使用条件,两指针同向且不回退。

4.滑动窗口算法

然后可以直接优化成滑动窗口算法

class Solution 
{
public:
//滑动窗口:int totalFruit(vector<int>& fruits) {int n = fruits.size(), ret = 0,sum = 0,kands = 0;int hash[100001] = {0};//哈希数组for(int right = 0, left = 0;right < n;right++){//进窗口if(hash[fruits[right]] == 0)kands++;//如果这个是一个新来的数,那么就种类++hash[fruits[right]]++;    sum++; //出窗口while(kands > 2){hash[fruits[left]]--;sum--;if(hash[fruits[left]] == 0)kands--;left++;}ret = max(ret, sum);}return ret;}
};

5.总结

总结一下这个题,我感觉正常做的话能做出来,也没啥坑,我感觉是属于一个很常规的滑动窗口的题目。


EOF

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

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

相关文章

工程技术综合SCI期刊,中科院2区,IF=3+,对国人非常友好!

一、期刊名称 Engineering Analysis with Boundary Elements 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;工程技术 影响因子&#xff1a;3.3 中科院分区&#xff1a;2区 出版方式&#xff1a;订阅模式/开放出版 版面费&#xff1a;选择开放出版需支…

MySQL——利用变量进行查询操作

新建链接&#xff0c;自带world数据库&#xff0c;里面自带city表格。 DQL # MySQL利用变量进行查询操作 set cityNameHaarlemmermeer; select * from city where NamecityName;# 多个结果查询 set cityName1Haarlemmermeer; set cityName2Breda; set cityName3Willemstad; s…

何为基差?股指期货的升水和贴水又怎么理解?

基差是一个金融术语&#xff0c;它指的是现货价格和期货价格之间的差额。在股指期货市场中&#xff0c;现货就是指实际的股票指数&#xff0c;而期货则是基于这个指数未来某个时间点的价格预期。基差可以是正的或负的&#xff0c;具体取决于期货价格是高于还是低于现货价格。 1…

Dbeaver连接一段时间不操作后断开的问题

右键数据库连接点击编辑连接点击初始化将连接保持改成60s

大势所趋!企业网站HTTPS升级全面普及化

JoySSL官网 注册码230918 HTTPS加密协议的应用无疑是维护网络信息安全的重要一环。随着技术的不断进步与用户隐私意识的增强&#xff0c;HTTPS加密已不再仅仅是大型企业的专属&#xff0c;而是逐渐成为所有企业网站的标准配置&#xff0c;其普及化趋势显而易见&#xff0c;堪称…

【JavaEE网络】HTTP/HTTPS协议的工作原理与格式详解

目录 HTTP/HTTPSHTTP是什么理解“应用层协议”理解HTTP协议的工作过程HTTP协议格式 HTTP/HTTPS HTTP是什么 应用层&#xff0c;一方面是需要自定义协议&#xff0c;一方面也会用到一些现成的协议 HTTP及HTTPS是应用层重点协议 使用浏览器&#xff0c;打开网站&#xff0c;这…

AI大模型探索之路-训练篇18:大语言模型预训练-微调技术之Prompt Tuning

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

ChatGPT开源的whisper音频生成字幕

1、前言 好了&#xff0c;那接下来看一下whisper开源库的介绍 有五种模型大小&#xff0c;其中四种仅支持英语&#xff0c;提供速度和准确性的权衡。上面便是可用模型的名称、大致的内存需求和相对速度。如果是英文版的语音&#xff0c;直接想转换为英文。 本来我是想直接在我的…

通过 Java 操作 redis -- zset 有序集合基本命令

目录 使用命令 zadd&#xff0c;zrange 使用命令 zcard 使用命令 zrem 使用命令 zscore 使用命令 zrank 关于 redis zset 有序集合类型的相关命令推荐看Redis - Zset 有序集合 要想通过 Java 操作 redis&#xff0c;首先要连接上 redis 服务器&#xff0c;推荐看通过 Jav…

003 redis分布式锁 jedis分布式锁 Redisson分布式锁 分段锁

文章目录 Redis分布式锁原理1.使用set的命令时&#xff0c;同时设置过期时间2.使用lua脚本&#xff0c;将加锁的命令放在lua脚本中原子性的执行 Jedis分布式锁实现pom.xmlRedisCommandLock.javaRedisCommandLockTest.java 锁过期问题1乐观锁方式&#xff0c;增加版本号(增加版本…

一、计算机基础(Java零基础一)

&#x1f33b;&#x1f33b;目录 一、&#x1f33b;&#x1f33b;剖析学习Java前的疑问&#x1f33b;&#x1f33b;1.1 零基础学习编程1.2 英语不好能学吗&#xff1f;1.3 理解慢能学好吗&#xff1f;1.4 现在学Java晚吗&#xff1f;1.5 Java 和 Python 还有 Go 的选择1.6 Java…

Elasticsearch 索引、类型、文档、分片与副本等核心概念介绍

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《洞察之眼&#xff1a;ELK监控与可视化》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Elasticsearch简介 2、分布式搜索引擎的工作原理…

【Linux】在Linux中执行命令ifconfig, 报错-bash:ifconfig: command not found解决方案

一、报错信息 ifconfig 报错-bash:ifconfig: command not found 同时&#xff0c;通过ip addr查看&#xff0c;也看不到IP信息 二、解决方案 找到ifcfg-ens0文件&#xff0c;此文件的目录在/etc/sysconfig/network-scripts目录下 命令&#xff1a;cd /etc/sysconfig/network…

英语学习笔记9——How are you today?

How are you today? 你好吗&#xff1f; 词汇 Vocabulary well adj. 好的 n. 井 fine adj. 美好的 两个方面&#xff1a;天气、身体。 搭配&#xff1a;a fine day 晴朗的一天    It’s a fine day today. 今天很晴朗。 good adj. 好的 口语偏多 搭配&#xff1a;Good jo…

【2022 深圳 ArchSummit 】大数据架构稳定性保障实践

文章目录 一、前言二、现状三、大数据架构的历史变迁&#xff08;一&#xff09;洪荒期&MR&#xff08;二&#xff09;远古期&MPP&#xff08;四&#xff09;近现代&Flink/Spark&#xff08;五&#xff09;现如今&实时数据湖架构 四、架构稳定的关键因素&#…

Bert 在 OCNLI 训练微调

目录 0 资料1 预训练权重2 wandb3 Bert-OCNLI3.1 目录结构3.2 导入的库3.3 数据集自然语言推断数据集路径读取数据集数据集样例展示数据集类别统计数据集类加载数据 3.4 Bert3.4 训练 4 训练微调结果3k10k50k 0 资料 【数据集微调】 阿里天池比赛 微调BERT的数据集&#xff0…

UE5(射线检测)学习笔记

这一篇会讲解射线检测点击事件、离开悬停、进入悬停事件的检测&#xff0c;以及关闭射线检测的事件&#xff0c;和射线检测蓝图的基础讲解。 创建一个简单的第三人称模板 创建一个射线检测的文件夹RadiationInspection&#xff0c;并且右键蓝图-场景组件-命名为BPC_Radiation…

路由模块封装

目录 一、问题引入 二、步骤 一、问题引入 随着项目内容的不断扩大&#xff0c;路由也会越来越多&#xff0c;把所有的路由配置都堆在main.js中就不太合适了&#xff0c;所以需要将路由模块抽离出来。其好处是&#xff1a;拆分模块&#xff0c;利于维护。 二、步骤 将路由相…

linux PXE高效批量网络装机

PXE批量部署的优点 规模化&#xff1a;同时装配多台服务器 自动化&#xff1a;安装系统、配置各种服务 远程实现&#xff1a;不需要光盘、U盘等安装介质 部署PXE远程安装服务 搭建PXE远程安装服务器 先做好初始化准备 1.安装并启用 TFTP 服务 yum -y install tftp-server …

从开发角度理解漏洞成因(02)

文章目录 文件上传类需求文件上传漏洞 文件下载类需求文件下载漏洞 扩展 留言板类&#xff08;XSS漏洞&#xff09;需求XSS漏洞 登录类需求cookie伪造漏洞万能密码登录 持续更新中… 文章中代码资源已上传资源&#xff0c;如需要打包好的请点击PHP开发漏洞环境&#xff08;SQL注…