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

news/2024/5/20 20:24:36

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

目录

  • 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.mrgr.cn/p/81867508

相关文章

【win10 文件夹数量和看到不一致查看隐藏文件已经打开,Thumb文件作妖】

目录 任务介绍&#xff1a;重命名规则修改前修改后 实现思路VB代码实现BUG犯罪现场&#xff08;眼见不一定为实&#xff09;破案1&#xff1a;抓顶风作案的反贼&#xff01;&#xff01;&#xff01;破案2&#xff1a;破隐身抓刺客&#xff01;&#xff01;&#xff01;杀器&am…

[4]自定义Lua解析器管理器-------演化脚本V0.7

使用自定义委托通过tolua来调用多返回值和长参数类型的函数。 防踩坑指南,使用自定义委托需要将委托类型添加到CustomSettings中。[4]自定义Lua解析器管理器-------演化脚本V0.7 使用自定义委托来调用lua脚本中的多返回值函数和长参数类型的函数。 先看代码,依旧是上篇文章中…

[转帖]Mysql数据库的事务特性、隔离级别及MVCC多版本并发控制简介

https://my.oschina.net/tongchengyu/blog/4714950事务的特性 数据库如果支持事务,就要满足下面四个特性(ACID)。 原子性(A:Atomicity) 在一个事务中,多个sql操作,要么一起成功(所有数据操作都成功),要么一起回滚(其中一个没有成功,其他数据操作一起恢复到开始状态…

2010NOIP普及组真题 2. 接水问题

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1950 解法一、朴素模拟 核心思想&#xff1a; 朴素模拟&#xff1a; 1、先给每个b[i]水龙头分配一个人a[i]&#xff0c;b[i] 表示水龙头的剩余时间。同时标记该水龙头为 used 使用中 2…

YOLOv9中模块总结补充|SPPELAN

专栏相关代码&#xff1a;目前售价售价69.9&#xff0c;改进点80 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 1. SPPELAN SPPELAN是YOLOv9作者在SPPF的基础上创新的模块&#xff08;增加了一次…

【Python深度学习(第二版)(2)】深度学习之前:机器学习简史

文章目录 一. 深度学习的起源1. 概率建模--机器学习分类器2. 早期神经网络--反向传播算法的转折3. 核方法 -- 忽略神经网络4. 决策树、随机森林和梯度提升机5. 神经网络替代svm与决策树 二. 深度学习与机器学习有何不同 可以这样说&#xff0c;当前工业界所使用的大部分机器学习…

vue3+ts+vant选择器选中文字效果

所需要的样式: 选中某个选项后文字有放大和改变颜色的效果 主要就是在van-picker上加class, 给对应的style样式即可 <van-pickerclass"custom-picker":title"pickerData.titleText"v-if"pickerData.ispicker"show-toolbar:columns"col…

(8)ILA介绍

一、ILA简介二、ILA使用 在IP Catalog中选择搜索ila,选择第一个:接下来进行一些参数的配置: 配置好后生成即可: 一般情况下选择额ooc模式,可以节省资源。 在IP Sources中可以看到生成的ila ip核,比较重要的是这个.veo文件,这个相当于是ila的一个例化的模板,将该模板直接…

文件IO笔试题

文件IO 笔试题 作业:设计程序,获取当前系统时间,把时间转换为特定格式”yy年mm月dd日 星期x tt:mm:ss”,并每隔1s写入到本地磁盘中一个叫做log.txt的文本中,如果文本不存在则创建。 代码: /***************************************************************************…

预测市场?预测股票?如何让预测有更高的准确率?

我们发现在足球赛中&#xff0c;只要知道一个简单的讯息&#xff08;主队过去的获胜机率超过一半&#xff09;&#xff0c;预测力就会明显好过随便乱猜。如果再加上第二个简单的讯息&#xff08;胜负纪录较佳的队伍会略占优势&#xff09;&#xff0c;可以再进一步提升预测力。…

BGP小实验

目录拓扑图环境介绍复盘实验总结配置R3R4R1R2 拓扑图环境介绍每台路由器上都有looback0,比如R4是4.4.4.4/32,直连接口地址为10.1.34.4/24,其他路由器直连和looback口地址类似,R4上还有looback1,地址为44.44.44.44/24。 R3和R4是EBGP邻居关系,AS123内路由器是IBGP邻居关系…

Vue入门到关门之Vue3学习

一、常用API 注意:本文项目均使用脚手架为 Vite 1、setup函数 (1)介绍 如果在项目中使用配置项API,那么写起来就和vue2的写法是一样的;但是如果在项目中写的是组合式API,那么组件中所用到的:数据、方法等等,均要配置在setup中。此外,setup() 钩子也是在组件中使用组合…

线程的常见方法

线程的常见方法 休眠&#xff1a; 让当前状态不再参与cpu的竞争&#xff0c;直到休眠结束&#xff1b; 结果&#xff1a;并不是完全交替进行的&#xff0c;因为只是休眠状态&#xff0c;也会存在争抢cpu 放弃&#xff1a; 让当前状态主动放弃时间片&#xff0c;下次再去争抢…

面试集中营—Redis架构篇

一、Redis到底是多线程还是单线程 1、redis6.0版本之前的单线程&#xff0c;是指网络请求I/O与数据的读写是由一个线程完成的&#xff1b; 2、redis6.0版本升级成了多线程&#xff0c;指的是在网络请求I/O阶段应用的多线程技术&#xff1b;而键值对的读写还是由单线程完成的。所…

sso-单点登录

单点登录 项目组成 基于spring-boot-2.1.8.RELEASE,使用redis完成完成 session记录。sso-basesso-serversso-client1sso-client2 sso-baseTokenFilter: 拦截获取是否登录,并获取登录用户设置到线程变量中TokenUtil:从redis获取指定key判断是否登录,以及登录用户;写入sessi…

Vue入门到关门之Vue2高级用法

一、在vue项目中使用ref属性 ref 属性是 Vue.js 中用于获取对 DOM 元素或组件实例的引用的属性。通过在普通标签上或组件上添加 ref 属性,我们可以在 JavaScript 代码中使用 this.$refs.xxx 来访问对应的 DOM 元素或组件实例。放在普通标签上,通过 this.$refs.名字---》取到的…

Vue入门到关门之Vue3项目创建

一、vue3介绍 1、为什么要学习vue3? vue3的变化: 首先vue3完全兼容vue2,但是vue3不建议用vue2的写法;其次,vue3拥抱TypeScript,之前vue2使用的JavaScript,ts完全兼容js 最后之前学的vue2 是配置项api,而vue3是组合式api optionsAPI(旧) => compositionAPI(新), 效…

LeNet-5上手敲代码

LeNet-5 LeNet-5由Yann LeCun在1998年提出&#xff0c;旨在解决手写数字识别问题&#xff0c;被认为是卷积神经网络的开创性工作之一。该网络是第一个被广泛应用于数字图像识别的神经网络之一&#xff0c;也是深度学习领域的里程碑之一。 LeNet-5的整体架构&#xff1a; 总体…

基于Springboot的校园竞赛管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园竞赛管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…