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:
1 <= fruits.length <= 1050 <= fruits[i] < fruits.lengthclass 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;
}
};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;
}
};class Solution {
public int totalFruit(int[] fruits) {
int prev = -1, count = 0, maxCount = 0;
int[] types = new int[2];
int[] streak = new int[2];
for(int f: fruits){
if(types[0] == f){
streak[0]++;
streak[1] = 0;
count++;
} else if(types[1] == f){
streak[1]++;
streak[0] = 0;
count++;
} else {
if(streak[0] == 0){
types[0] = f;
streak[0] = 1;
count = streak[1] + 1;
streak[1] = 0;
} else if (streak[1] == 0) {
types[1] = f;
streak[1] = 1;
count = streak[0] + 1;
streak[0] = 0;
}
}
maxCount = Math.max(maxCount, count);
}
return maxCount;
}
}