力扣-904.水果成篮
本文最后更新于:2022年10月17日 晚上
题目描述
思路及实现
if-else分析法
由题我们可以知道,其实题目就是给你一个数组,然后让你找出只包含两个不同元素(数字)的最长切片长度。
那么我们可以用一个basket
列表来存储当前篮子中的水果类型(也就是数字),max_num
则是最多能采摘的水果数量(只包含两个不同数字的最大切片长度),cnt
保存当前篮子里的水果数量(当前切片长度),mark
则是用于帮助回溯前一个水果类型最前边的一颗果树的位置(比如:[3, 3, 3]
,那么mark应该是1)。
然后对数组fruits
进行遍历,一共四种情况,可以看代码注释。
1 |
|
滑动窗口
我们用left
和right
分别表示满足要求的窗口的左右边界,然后用哈希表来存储这个窗口内的水果(数)以及水果的数量(出现的次数)。哈希表中的Key
的数量就是果篮里装的水果类型的数量,Value
则是水果类型对应水果的数量。
然后每次right
都会向右移动一个位置,记录并更新哈希表,并判断哈希表中是否超过两种水果(Key
的数量大于2),如果超过,就要开始移动left
,同时更新哈希表,如果哈希表中一个水果的数量Value
为0,那就删除对应的键值对,让哈希表中只留下两种水果。
1 |
|
看到的优化思路:因为题目是要找最大的窗口,所以我们可以不缩小窗口,只不过不满足条件的时候不更新窗口,直接让窗口整体向右移动即可。
希望本文章能够帮到您~
力扣-904.水果成篮
https://map1e-g.github.io/2022/10/17/leetcode-904/