LeetCode-in-Java

904. Fruit Into Baskets

Medium

You are visiting a farm that has a single row of fruit trees arranged from left to right. The trees are represented by an integer array fruits where fruits[i] is the type of fruit the ith tree produces.

You want to collect as much fruit as possible. However, the owner has some strict rules that you must follow:

Given the integer array fruits, return the maximum number of fruits you can pick.

Example 1:

Input: fruits = [1,2,1]

Output: 3

Explanation: We can pick from all 3 trees.

Example 2:

Input: fruits = [0,1,2,2]

Output: 3

Explanation: We can pick from trees [1,2,2]. If we had started at the first tree, we would only pick from trees [0,1].

Example 3:

Input: fruits = [1,2,3,2,2]

Output: 4

Explanation: We can pick from trees [2,3,2,2]. If we had started at the first tree, we would only pick from trees [1,2].

Constraints:

Solution

public class Solution {
    public int totalFruit(int[] fruits) {
        int end = 1;
        int basket1 = fruits[0];
        int basket2 = -1;
        int secondFruitIndex = -1;
        int maxTotal = 1;
        int counter = 1;
        while (end < fruits.length) {
            if (fruits[end - 1] != fruits[end]) {
                if (basket2 == -1) {
                    basket2 = fruits[end];
                    secondFruitIndex = end;
                    counter++;
                } else if (fruits[end] == basket1) {
                    basket1 = basket2;
                    basket2 = fruits[end];
                    secondFruitIndex = end;
                    counter++;
                } else {
                    counter = end - secondFruitIndex + 1;
                    basket1 = basket2;
                    basket2 = fruits[end];
                    secondFruitIndex = end;
                }
            } else {
                counter++;
            }
            end++;
            maxTotal = Math.max(maxTotal, counter);
        }
        return maxTotal;
    }
}