解锁高效算法思维:滑动窗口法,让你轻松搞定复杂题!(3)

解锁高效算法思维:滑动窗口法,让你轻松搞定复杂题!(3)

前言:

在算法学习的旅程中,很多同学会被复杂的题目绊住脚步,尤其是当问题涉及到大量数据处理和优化时,往往会让人望而却步。而滑动窗口法,作为一种高效的算法思想,正是破解这类题目的一把利器。通过滑动窗口,我们可以在不增加时间复杂度的情况下动态调整解题范围,从而大幅提升解题效率。本文将带你深入理解滑动窗口的核心思想,通过丰富的例题和详细的讲解,助你轻松驾驭这项高效的算法技巧!

希望你在阅读本篇文章后,对滑动窗口法有更深的认识,也能够在遇到相关题目时更加得心应手。让我们一起解锁高效算法思维,挑战更高难度的题目吧!下面进入我们的代码时间。


正文:

1.水果成篮

1.1.题目来源

本题源自于力扣,下面放上链接:https://leetcode.cn/problems/fruit-into-baskets/

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.2.题目解析

本题目很长,有些读者朋友可能就在读题目讲解的时候就漏了怯,其实这个题目如果我们认真读起来的话,其实难度不算很大,下面小编就给各位简单的概括一下本题目:这个题目其实就是给了我们一个数组(数组的元素表示数的类型),我们需要找到一个子数组,使数组里面的类型小于等于2,找到符合条件的最长数组即可,这其实就是题目概括下来的内容,其实这个题目看起来,是很容易想到滑动窗口的解法的,通过给我们的第二个规矩即可看出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

右移就暗指我们需要使用滑动窗口或者暴力解法来做和这个题目,下面给出这个题目的思路解读。

1.3.题目思路解答

1.3.1.滑动窗口 + 哈希表

正如标题所言,此时这个题目我们还是需要用到一个数据结构——哈希表,因为哈希表可以存储元素的种类和个数,本题我们就是要记录水果的种类和个数,所以此时哈希表正好可以解决这个问题,所以我们在设立好一个哈希表以后,就可以设置两个指针来准备滑动窗口式遍历数组,首先我们就要先入窗口,入窗口的操作就是我们把元素存入哈希表中,之后我们就要进行判断,如果哈希表里面的元素个数大于2的话,此时我们就没有"篮子"装水果了,此时我们就需要进行出窗口操作,即让让左边位于哈希表中的元素减1,然后我们判断一下此时左边元素的个数是否为0,如果是0的话,那么此时我们就可以直接把这个元素删除,然后让左窗口往右边滑即可;否则我们就需要循环删除,直到哈希表内的元素种类小于等于2,之后我们就要进行更新数据的操作,此时我们记录数组的长度,并且和之前的数做比较,保留最大的那个,然后right指针往右遍历即可,这就是这个题目的解法,下面小编进入代码实操部分。

1.4.代码实操

首先,我们需要准备好几个“工具”,一个是哈希表,这个哈希表是要用unordered_map表示(这个目前小编还没有学到,不知道的读者朋友我在这里简单说一下它的用法,它可以储存元素的种类和个数),还要有双指针(left和right),一个计数器(记录此时符合要求的数组的长度),下面给出代码:

unordered_map<int, int> hash;
int left = 0,right = 0,n = fruits.size(),ret = 0;

之后,我们就要进入循环,循环条件都是一样的(当然这不是肯定句,我害怕之后刷题我来打我自己的脸o(╥﹏╥)o),如下所示࿱

评论 56
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值