首页 > 其他分享 >图解LeetCode——904. 水果成篮(难度:中等)

图解LeetCode——904. 水果成篮(难度:中等)

时间:2023-05-23 11:00:39浏览次数:36  
标签:水果 904 int 采摘 startIndex diffIndex fruits 成篮 LeetCode


一、题目

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

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

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

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

二、示例

2.1> 示例 1:

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

2.2> 示例 2:

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

2.3> 示例 3:

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

2.4> 示例 4:

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

提示:

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

三、解题思路

根据题目描述,我们只可以拿两种类型的水果,并且获取的顺序是按照数组fruits的顺序从左向右的,那么我们可以选择采用滑动窗口的方式对窗口内两种类型的水果数量进行计算,并且针对每个窗口中的水果数量进行计算,最终选取最大值返回即可。

我们以下图中fruits = [3,3,3,1,2,1,1,2,3,3,4]为例,首先我们需要如下几个参数:

startIndex:表示窗口的起点。
diffIndex:每当发现相邻两个水果不同,则将其指向发生不同的那个水果,当遍历发现有第三种水果的时候,用于将其作为新窗口的起点。
pickRecords:用于记录当前窗口内选中的水果(下图没有画),默认未选中为0,选中为1;
pickNums:用于记录当前窗口内,已经选中的水果种类数量。
curFruit:用于记录当前选中的苹果类型,当发现curFruit与fruits[i]不同时,diffIndex = fruits[i]。

我们从头开始遍历,遍历指针i,每当发现遍历到的这个水果种类fruits[i]与curFruit不同时,就说明我们拿到了新的品种,那么pickNums加1,当超过2种的时候,我们就通过i-startIndex对窗口内的水果数量进行计算,然后移动窗口,将新窗口的起点设定为diffIndex指向的位置,然后继续遍历水果,以此类推进行计算。具体操作如下图所示,此处就不赘述了:

图解LeetCode——904. 水果成篮(难度:中等)_新窗口

四、代码实现

class Solution {
    public int totalFruit(int[] fruits) {
        int[] pickRecords = new int[fruits.length];
        int result = 0, startIndex = 0, diffIndex = 0, pickNums = 0, curFruit = 0;
        for (int i = 0; i < fruits.length; i++) {
            if (pickRecords[fruits[i]] == 0) {
                if (pickNums == 2) {
                    result = Math.max(result, i - startIndex);
                    pickRecords[fruits[diffIndex - 1]] = 0; // 将水果设置为“未被选择”
                    startIndex = diffIndex; // 记录“窗口”的开始index
                    pickNums--; // 已选择的水果种类-1
                }
                pickNums++; // 已选择的水果种类+1
                pickRecords[fruits[i]] = 1; // 将水果设置为“被选择”
            }
            if (curFruit != fruits[i]) {
                curFruit = fruits[i]; // 当前水果类型
                diffIndex = i; // 记录水果类型变换时的index
            }
        }
        return Math.max(result, fruits.length - startIndex);
    }
}

图解LeetCode——904. 水果成篮(难度:中等)_新窗口_02

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

标签:水果,904,int,采摘,startIndex,diffIndex,fruits,成篮,LeetCode
From: https://blog.51cto.com/u_15003301/6330133

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:平衡二叉树
    题目:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例1:输入:root=[3,9,20,null,null,15,7]输出:true示例2:输入:root=[1,2,2,3,3,null,null,4,4]输出:false示例3:输入:root=[]......
  • #yyds干货盘点# LeetCode程序员面试金典:分数到小数
    1.简述:给定两个整数,分别表示分数的分子 numerator和分母denominator,以字符串形式返回小数。如果小数部分为循环小数,则将循环的部分括在括号内。如果存在多个答案,只需返回任意一个。对于所有给定的输入,保证答案字符串的长度小于104。 示例1:输入:numerator=1,denominat......
  • LeetCode 103. 二叉树的锯齿形层次遍历
    classSolution{public:vector<vector<int>>res;voidbfs(TreeNode*root){queue<TreeNode*>q;q.push(root);intcnt=0;while(!q.empty()){vector<int>level;......
  • LeetCode 周赛 346(2023/05/21)仅 68 人 AK 的最短路问题
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。LeetCode单周赛第345场·体验一题多解的算法之美单周赛345概览T1.删除子串后的字符串最小长度(Easy)标签:栈T2.字典序最小回文串(Medium)标签:贪心、双指针T3.求一个整数的惩罚数(Medium)标签......
  • leetcode724
    使用数学方法:假设左边的所有数加起来的和是sum,total为数组所有元素加起来的和,当i满足中心下标的条件时,即:sum=total-sum-nums[i];2*sum+nums[i]=total;当中心下标是首位时,即左边sum为0;当中心下标是尾位时,右边total-sum-nums[i]为0;for(inti=0;i<n;++i){if(2*sum+nums[i]==......
  • 图解LeetCode——19. 删除链表的倒数第 N 个结点
    一、题目给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。二、示例2.1>示例1:【输入】head=[1,2,3,4,5],n=2【输出】[1,2,3,5]2.2>示例2:【输入】head=[1],n=1【输出】[]2.3>示例3:【输入】head=[1,2],n=1【输出】[1]提示:链......
  • #yyds干货盘点# LeetCode程序员面试金典:有序链表转换二叉搜索树
    题目:给定一个单链表的头节点 head ,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过1。 示例1:输入:head=[-10,-3,0,5,9]输出:[0,-3,9,-10,null,5]解释:一个可能的答案是[0,-3,9,-1......
  • #yyds干货盘点# LeetCode程序员面试金典:比较版本号
    1.简述:给你两个版本号version1和version2,请你比较它们。版本号由一个或多个修订号组成,各修订号由一个'.'连接。每个修订号由多位数字组成,可能包含前导零。每个版本号至少包含一个字符。修订号从左到右编号,下标从0开始,最左边的修订号下标为0,下一个修订号下标为1,以此......
  • LeetCode 746.使用最小花费爬楼梯
    1.题目:给你一个整数数组cost,其中cost[i]是从楼梯第i个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为0或下标为1的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。示例1:输入:cost=[10,15,20]输出:15解释:你......
  • leetcode1493
    递归:1.记pre[i]为以i位置结尾的连续1长度。 pre[i]=0;ai=0pre[i]=pre[i-1]+1;ai=1记suf[i]为以位置i开头的连续1长度;suf[i]=0;ai=0suf[i]=suf[i+1]+1;ai=1计算删掉i位置的连续1的长度为pre[i-1]+suf[i+1],再枚举每个位置找出最大的数返回。ans=max(pre[n-2],suf[1]);//......