← All problems

904. Fruit into Baskets

MediumOpen on LeetCodeProblem statement

Problem Statement

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:

C++ — alternative 1

Source file
class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        if(fruits.size()<=2)
            return fruits.size();
        int lt=0, rt=0, change=0, ans=-1;
        vector<int> basket(2,0);
        while(rt<fruits.size()){
            basket[0]=fruits[change];
            lt=change;
            while(rt<fruits.size() && fruits[rt]==fruits[lt])
                rt++;
            if(rt>=fruits.size()){
                ans = max(ans, rt-lt);
                return ans;
            }
            change=rt;
            basket[1]=fruits[rt];
            while(rt<fruits.size() && (fruits[rt]==basket[1] ||  fruits[rt]==basket[0])){
                if(fruits[rt]!=fruits[change])
                    change=rt;
                rt++;
            }
            ans = max(ans, rt-lt);
            // cout << basket[0] << "\t" << basket[1] << "\t(" << lt << ", " << rt << ")\t" << ans << endl;
        }
        return ans;
    }
};