Leetcode 904 Fruit Into Baskets (双指针)

Leetcode 904

问题描述

In a row of trees, the i-th tree produces fruit with type tree[i].

You start at any tree of your choice, then repeatedly perform the following steps:

Add one piece of fruit from this tree to your baskets.  If you cannot, stop.
Move to the next tree to the right of the current tree.  If there is no tree to the right, stop.
Note that you do not have any choice after the initial choice of starting tree: you must perform step 1, then step 2, then back to step 1, then step 2, and so on until you stop.

You have two baskets, and each basket can carry any quantity of fruit, but you want each basket to only carry one type of fruit each.

What is the total amount of fruit you can collect with this procedure?

例子

Example 1:
Input: [1,2,1]
Output: 3
Explanation: We can collect [1,2,1].

Example 2:
Input: [0,1,2,2]
Output: 3
Explanation: We can collect [1,2,2].
If we started at the first tree, we would only collect [0, 1].

Example 3:
Input: [1,2,3,2,2]
Output: 4
Explanation: We can collect [2,3,2,2].
If we started at the first tree, we would only collect [1, 2].

Example 4:
Input: [3,3,3,1,2,1,1,2,3,3,4]
Output: 5
Explanation: We can collect [1,2,1,1,2].
If we started at the first tree or the eighth tree, we would only collect 4 fruits.

方法

** Solution Java **
** 5ms, beats 90.26% **
** 46.7MB, beats 92.45% **
class Solution {
    public int totalFruit(int[] tree) {
        int n = tree.length, count = 2, res = 0;
        int[] map = new int[n];
        for (int i = 0, j = 0; j < n; ++j) {
            if (map[tree[j]] == 0)
                --count;
            ++map[tree[j]];
            while (count == -1) {
                if (--map[tree[i++]] == 0)
                    ++count;
            }
            res = Math.max(res, j - i + 1);
        }
        return res;
    }
}

方法二

  循环所有的水果c中tree,
  需要注意的是a和b是我们见面的最后两个不同类型的水果,
  c是目前果型,
  所以它的东西,如“...... aaabbbc ......”

  案例1 c == b:
  水果c已经在篮子里,
  和最后一种水果相同
  cur += 1
  count_b += 1

  案例2 c == a:
  水果c已经在篮子里了,
  但与最后一种水果不一样
  cur += 1
  count_b = 1
  a = b, b = c

  情况3 c != b && c!= a:
  水果c不在篮子里,
  cur = count_b + 1
  count_b = 1
  a = b, b = c

当然,在每一轮中我们都需要更新 res = max(res, cur)

** Solution Java **
** 5ms, beats 90.26% **
** 47MB, beats 86.79% **
class Solution {
    public int totalFruit(int[] tree) {
        int res = 0, cur = 0, count_b = 0, a = 0, b = 0;
        for (int c :  tree) {
            cur = c == a || c == b ? cur + 1 : count_b + 1;
            count_b = c == b ? count_b + 1 : 1;
            if (b != c) {a = b; b = c;}
            res = Math.max(res, cur);
        }
        return res;
    }
}
原文地址:https://www.cnblogs.com/willwuss/p/12518264.html