leecode1224 最大出现频率(哈希表的应用)

原题链接

题意

给你一个正整数数组 nums,请你帮忙从该数组中找出能满足下面要求的 最长 前缀,并返回该前缀的长度:

从前缀中 恰好删除一个 元素后,剩下每个数字的出现次数都相同。
如果删除这个元素后没有剩余元素存在,仍可认为每个数字都具有相同的出现次数(也就是 0 次)。

样例1 
  输入:nums = [2,2,1,1,5,3,3,5]  
  输出:7
  解释:对于长度为 7 的子数组 [2,2,1,1,5,3,3],如果我们从中删去 nums[4] = 5,就可以得到 [2,2,1,1,3,3],里面每个数字都出现了两次

数据范围
2 <= nums.length <= 105
1 <= nums[i] <= 10

思路

思路是维护两个哈希表,哈希表1存储当前数字出现的次数,哈希表2存储当前这个出现次数有多少个不同的数字,再维护一个最大出现次数作比较
然后进行判断即可
满足题意的前缀有三种情况:abcde 这种随便删都满足
aabbccc 这种删掉最后一个满足
aabbc 这种删掉最后一个满足
最后比较答案

c++代码

class Solution {
public:
  int maxEqualFreq(vector<int>& nums) {
    int n = (int) nums.size(), maxn = 0, res = 0;
    unordered_map<int, int> S, mp; // S存储数字nums[i]出现次数,mp[t]存储出现t次的出现次数
    for (int i = 0; i < n; i++) {
      if (S[nums[i]] > 0) {
        mp[S[nums[i]]]--; // 因为nums[i]的出现次数已经是S[nums[i]]+1次了(悲)
      }
      S[nums[i]]++;
      mp[S[nums[i]]]++;
      maxn = max(S[nums[i]], maxn);
      bool ok = 0;
      // 满足以下条件都能成为符合题意的前缀数组
      if (maxn == 1) ok = 1; // 全不一样,随便删 abcde
      else if (mp[maxn]*maxn + mp[maxn-1]*(maxn-1) == i+1 && mp[maxn] == 1) ok = 1; // 唯一出现次数最多的数字只有一个且其他数字出现次数一样且只比出现次数最多的数字少1  aabbccc
      else if (mp[maxn]*maxn + mp[1]*1 == i+1 && mp[1] == 1) ok = 1; // 唯一出现次数最少的数字出现次数为1,且别的数字出现次数大于他的同时其他数字出现次数相同 aabbc
      if (ok) res = max(res, i+1);
    }
    return res;
  }
};

posted on   chelly酱  阅读(24)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示