用C ++将水果放入篮子

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