C ++中的最大相等频率

假设我们有一个正整数的数组num,我们必须返回给定数组num的数组前缀的最大可能长度,这样就可以从该前缀中精确删除一个元素,以便其中出现的每个数字都会具有相同的频率。如果没有剩余元素,则删除一个元素后,仍会认为每个出现的数字具有相同的频率。

因此,如果输入类似于[3,3,2,2,6,4,4,6],则输出将为7,因此,如果我们从索引4中删除元素6,则子数组将为[3, [3,2,2,4,4],其中所有元素出现两次。

为了解决这个问题,我们将遵循以下步骤-

  • maxf:= 0,res:= 0

  • 定义映射cnt和freq

  • 对于初始化i:= 0,当i <nums大小时,更新(将i增加1),执行-

    • 分辨率:= i + 1

    • x:= nums [i]

    • (将cnt [x]增加1)

    • f:= cnt [x]

    • (将freq [f]增加1)

    • 将freq [f-1]减少1

    • maxf:= maxf和f的最大值

    • 如果maxf * freq [maxf]与i相同或(maxf-1)*(freq [maxf-1] + 1)与i相同或maxf与1相同,则-

    • 返回资源

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
       public:
       int maxEqualFreq(vector<int>& nums) {
          int maxf = 0, res = 0;
          map<int, int> cnt, freq;
          for (int i = 0; i < nums.size(); i++) {
             int x = nums[i];
             cnt[x]++;
             int f = cnt[x];
             freq[f]++;
             freq[f - 1]--;
             maxf = max(maxf, f);
             if (maxf * freq[maxf] == i || (maxf - 1) * (freq[maxf - 1] + 1) == i || maxf == 1) {
                res = i + 1;
             }
          }
          return res;
       }
    };
    main(){
       Solution ob;
       vector<int> v = {3,3,2,2,6,4,4,6};
       cout << (ob.maxEqualFreq(v));
    }

    输入项

    {3,3,2,2,6,4,4,6}

    输出结果

    7