Leetcode第904题

这篇博客讨论了如何解决LeetCode的第904题,即如何找到一排树中能收集的最大水果数量。通过采用双指针策略,我们可以有效地计算出只包含两种水果的最长子序列。代码实现中,两个指针分别代表当前水果和前一个水果,当遇到新的水果类型时,更新计数并移动指针。这种方法能确保每个篮子只装一种类型的水果,同时最大化收集量。
摘要由CSDN通过智能技术生成

Leetcode第904题

题目:
在一排树中,第 i 棵树产生 tree[i] 型的水果。你可以从你选择的任何树开始,然后重复执行以下步骤:

  1. 把这棵树上的水果放进你的篮子里。如果你做不到,就停下来。
  2. 移动到当前树右侧的下一棵树。如果右边没有树,就停下来。

请注意,在选择一颗树后,你没有任何选择:你必须执行步骤 1,然后执行步骤 2,然后返回步骤 1,然后执行步骤 2,依此类推,直至停止。
你有两个篮子,每个篮子可以携带任何数量的水果,但你希望每个篮子只携带一种类型的水果。
用这个程序你能收集的水果树的最大总量是多少?

思路:

  • 该问题可以简化为:求数组中只包含2个数的子序列的最大长度
  • 解题方法为:可用双指针解决。用两个指针分别指向两个不同的水果,并移动后面的指针,判断是否遇到了新的水果,如果没有新水果出现,那么计数值加1;如果遇到新的水果,那么将前面的指针向后移动,并将后面的指针指向新的水果。

代码:

/*
 * @lc app=leetcode.cn id=904 lang=java
 *
 * [904] 水果成篮
 */

// @lc code=start
class Solution
{
    public int totalFruit(int[] fruits)
    {
        int lastFruit = fruits[0];//保存最后一个水果
        int secondLastFruit = fruits[0];//保存倒数第二种水果
        int lastFruitCnt = 0;//计数最后一种水果的数量
        int max = 0;//返回结果
        int curMax = 0;//当前序列的长度
        for (int fruit : fruits)
        {
            //如果是lastFruit或者secondLastFruit,curMax加1
            if (fruit == lastFruit || fruit == secondLastFruit)
            {
                curMax++;
            }
            //否则,当前curMax为lastFruit和新添加的水果的数量
            else
            {
                curMax = lastFruitCnt + 1;
            }
            //当前fruit和lastFruit相同
            if (fruit == lastFruit)
            {
                lastFruitCnt++;
            }
            //如果不同,则需要移动lastFruitCnt和secondLastFruit的位置
            else
            {
                lastFruitCnt = 1;
                secondLastFruit = lastFruit;
                lastFruit = fruit;
            }
            max = Integer.max(max, curMax);
        }
        return max;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值