假设我们有一排树,第i棵树产生的树的类型为tree [i]。我们可以从我们选择的任何树开始,然后重复执行这些步骤-
从这棵树上添加一块水果到我们的篮子里。如果没有机会,请停止。
移至当前树右侧的下一棵树。如果右边没有树,请停止。
我们有两个篮子,每个篮子可以装任何数量的水果,但是我们希望每个篮子只能装一种水果。我们必须找到可以通过此程序收集的水果总量吗?因此,如果树是[0,1,2,2],则输出将为3。我们可以收集[1,2,2],如果我们从第一棵树开始,那么我们只会收集[0,1, 1]
为了解决这个问题,我们将遵循以下步骤-
n:=树大小,j:= 0,ans:= 0
创建一张映射
对于i,范围为0至n – 1
将m [tree [j]]减少1
如果m [tree [j]] = 0,则从m中删除tree [j]
将j增加1
将m [tree [i]]增加1
当m的大小> 2且j <= i时,则
ans:= i – j + 1和ans的最大值
返回ans
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int totalFruit(vector<int>& tree) {
int n = tree.size();
int j = 0;
map <int, int> m;
int ans = 0;
for(int i = 0; i < n; i++){
m[tree[i]] += 1;
while(m.size() > 2 && j <= i){
m[tree[j]]--;
if(m[tree[j]] == 0)m.erase(tree[j]);
j++;
}
ans = max(i - j + 1, ans);
}
return ans;
}
};
main(){
vector<int> v = {3,3,3,1,2,1,1,2,3,3,4};
Solution ob;
cout <<(ob.totalFruit(v));
}[3,3,3,1,2,1,1,2,3,3,4]
输出结果
5