假设我们有一排树,第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