• Leetcode刷题解析——904. 水果成篮


    1. 题目链接:904. 水果成篮

    2. 题目描述:

    你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类

    你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:

    • 你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。
    • 你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。
    • 一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。

    给你一个整数数组 fruits ,返回你可以收集的水果的 最大 数目。

    示例 1:

    输入:fruits = [1,2,1]
    输出:3
    解释:可以采摘全部 3 棵树。
    
    • 1
    • 2
    • 3

    示例 2:

    输入:fruits = [0,1,2,2]
    输出:3
    解释:可以采摘 [1,2,2] 这三棵树。
    如果从第一棵树开始采摘,则只能采摘 [0,1] 这两棵树。
    
    • 1
    • 2
    • 3
    • 4

    示例 3:

    输入:fruits = [1,2,3,2,2]
    输出:4
    解释:可以采摘 [2,3,2,2] 这四棵树。
    如果从第一棵树开始采摘,则只能采摘 [1,2] 这两棵树。
    
    • 1
    • 2
    • 3
    • 4

    示例 4:

    输入:fruits = [3,3,3,1,2,1,1,2,3,3,4]
    输出:5
    解释:可以采摘 [1,2,1,1,2] 这五棵树。
    
    • 1
    • 2
    • 3

    提示:

    • 1 <= fruits.length <= 105
    • 0 <= fruits[i] < fruits.length

    3. 解法(滑动窗口

    3.1 算法思路:

    求一段连续的空间,使用滑动窗口思想

    让滑动窗口满足:窗口内水果的种类只有两种

    做法:右端水果进入窗口的时候,用哈希表统计这个水果的频次。这个水果进来后,判断哈希表的大小:

    • 如果大小超过2:说明窗口内水果种类超过了两种。那么就从左侧开始依次将水果划出窗口,直到哈希表的大小小于等于2,然后更新结果
    • 如果没有超过2,说明当前窗口水果的种类不超过两种,直接更新结果ret

    3.2 算法流程:

    • 初始化哈希表hash来统计窗口内水果的种类和数量;
    • 初始化变量:左右指针left=0right=0,记录结果的变量ret=0
    • right小于数组大小的时候,一直执行下列循环:
      • 将当前水果放入哈希表中
      • 判断当前水果进来后,嘻哈表的大小:
        • 如果超过2
          • 将左侧元素滑出窗⼝,并且在哈希表中将该元素的频次减⼀;
          • 如果这个元素的频次减⼀之后变成了 0,就把该元素从哈希表中删除;
          • 重复上述两个过程,直到哈希表中的⼤⼩不超过 2
      • 更新结果ret
      • right++,让下一个元素进入窗口
    • 循环结束后,ret存的就是最终结果

    请添加图片描述

    3.3 C++算法代码:

    class Solution {
    public:
        int totalFruit(vector& fruits) {
            int hash[100001]={0};//统计窗口出现了多少种水果
            int ret=0;
            for(int left=0,right=0,kinds=0;right2)//判断
                {
                    //出窗口
                    hash[fruits[left]]--;
                    if(hash[fruits[left]]==0) kinds--;
                    left++;
                }
                ret=max(ret,right-left+1);
            }
            return ret;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    数据结构之单链表
    【神印王座】林鑫和李馨甜蜜接吻,团灭七阶恶魔,温馨结尾
    小龙虾优化算法COA求解不闭合SD-MTSP,可以修改旅行商个数及起点(提供MATLAB代码)
    Maven 集成 Wagon
    LeetCode 3217.从链表中移除在数组中存在的节点
    第7个1024
    CSS工具与工作流
    ERD Online 4.0.3数据库在线建模(免费、更美、更稳定)
    Java基于JSP旅游网站系统的设计于实现
    【MATLAB】制作一幅钻石沿着圆周运动的动画
  • 原文地址:https://blog.csdn.net/weixin_51799303/article/details/133871980