力扣精选算法100题——水果成篮(滑动窗口专题)

本题链接👉水果成篮


第一步:了解题意

我就按照实例1来进行对这题的理解。

1代表种类类型,这个数组里面有2个种类类型 ps:种类1和种类2 ,只不过种类1是有2个水果,种类2有一个水果,共计3个水果。

本题需要解答:收集水果的最大数目.

但是前提条件:

  • 我们只有2个篮子,每个篮子里只能装1种类型,但是篮子里的数量是不限制的。
  • 每采摘一次,将会可以向右移动到下一棵树,并继续采摘,不能跳过一棵树
  • 2个篮子表示着我们只能容纳2个类型的,出现第3类型的苹果,我们就直接结束采摘

就按实例3来表示:fruits[1,2,3,2,2]

1,2,遇到3的时候,这就是我们遇到的第三种类型水果了,那么我们就需要停止,这时候就可以记录一次苹果的数量2,其实后面就不用看了。

然后就从2开始,因为2,3是2种类型就可以继续采摘,大于2才是不行的,所以2,3,2,2,一直是可以的,因为都是种类2,相当于同一种类型,所以苹果数量是4,这时候最大的采摘数量是4.


第二步:算法思路

以后我们遇到一些题目记录一些重复值个数,如果超过几个数或者不能重复,就需要将这个值存入到哈希表中(其实就是值得映射到数组中去)

大部分题目都是从 暴力枚举 然后一步一步的优化得到的,所以

第一种解法:暴力枚举+哈希

首先定义2个指针,都是在0位置出发。

暴力枚举中的第二步,每一次都得清空hash中的值,我们就会觉得很繁琐,那么如何优化呢?


第二种解法:滑动窗口+哈希

滑动窗口的模板:

1.left=0,right=0;

2.进窗口

3.判断

4.出窗口

更新结果(这是是在上面的4个步骤中根据题目的不同来穿插的)

2.进窗口

实际上,就是让right的值存入到hash表中(hash表其实就是一个一维数组)

3.判断

我们上面再了解题意的时候已经写上了(种类超过2种的就得停止采摘)

所以判断的条件就是是否超过2种种类。

4.出窗口

出窗口建立在判断的时候的 ,判断了超过2种类型,我们就得出窗口,left对应的值就得--,如果减到0了我们就得给种类-1,知道减到种类=2,left++,我们就可以继续进行滑动窗口的步骤。

5.更新结果

结果是只要判断结果kinds<2就可以更新结果。

第三步:代码实现

复制代码
class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        int hash[100001]={0};//统计窗口中出现了多少种水果
        int ret=0;
        for(int left=0,right=0,kinds=0;right<fruits.size();right++)
        {
            if(hash[fruits[right]]==0) kinds++;
            hash[fruits[right]]++;//进窗口
            while(kinds>2)//判断
            {
                //出窗口
                hash[fruits[left]]--;//left对应的值一直--
                if(hash[fruits[left]]==0) kinds--;//直到-到0就给种类--
                left++;
            }
            ret=max(ret,right-left+1);
        }
        return ret;
    }
};

我永远走在提升自己的路上~

相关推荐
hetao17338377 小时前
2026-04-09~12 hetao1733837 的刷题记录
c++·算法
6Hzlia7 小时前
【Hot 100 刷题计划】 LeetCode 136. 只出现一次的数字 | C++ 哈希表&异或基础解法
c++·算法·leetcode
MWWZ7 小时前
最近的一些软件更新
opencv·算法·计算机视觉
CoovallyAIHub7 小时前
视频理解新范式:Agent不再被动看视频,LensWalk让它自己决定看哪里
算法·架构·github
CoovallyAIHub7 小时前
斯坦福丨AirVLA:将地面机械臂模型迁移至无人机实现空中抓取,成功率从23%提升至50%
算法·架构·github
无限进步_8 小时前
【C++】只出现一次的数字 II:位运算的三种解法深度解析
数据结构·c++·ide·windows·git·算法·leetcode
Takoony8 小时前
GPU 推理并发的本质:从第一性原理到工程实践
算法·gru
哎嗨人生公众号9 小时前
手写求导公式,让轨迹优化性能飞升,150ms变成9ms
开发语言·c++·算法·机器人·自动驾驶
foundbug9999 小时前
STM32 内部温度传感器测量程序(标准库函数版)
stm32·单片机·嵌入式硬件·算法
Hello.Reader9 小时前
为什么学线性代数(一)
线性代数·算法·机器学习