1224-最大相等频率
给你一个正整数数组 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 = [1,1,1,2,2,2,3,3,3,4,4,4,5]
**输出:** 13
提示:
2 <= nums.length <= 105
1 <= nums[i] <= 105
方法一:哈希表
使用哈希表 count 记录数 x 出现的次数 count}[x],freq 记录出现次数为 f 的数的数目为 freq}[f],maxFreq 表示最大出现次数。
依次遍历数组,假设当前访问的数为 nums}[i],对应地更新 count,freq 以及 maxFreq。以 nums}[i] 结尾的数组前缀符合要求的充要条件为满足以下三个条件之一:
最大出现次数 maxFreq} = 1:那么所有数的出现次数都是一次,随意删除一个数既可符合要求。
所有数的出现次数都是 maxFreq 或 maxFreq} - 1,并且最大出现次数的数只有一个:删除一个最大出现次数的数,那么所有数的出现次数都是 maxFreq} - 1。
除开一个数,其他所有数的出现次数都是 maxFreq,并且该数的出现次数为 1:直接删除出现次数为 1 的数,那么所有数的出现次数都是 maxFreq。
1 | class Solution: |
1 | class Solution { |
1 | class Solution { |
1 | public class Solution { |
1 |
|
1 | var maxEqualFreq = function(nums) { |
1 | func maxEqualFreq(nums []int) (ans int) { |
复杂度分析
时间复杂度:O(n),其中 n 是数组 nums 的长度。遍历数组 nums 需要 O(n)。
空间复杂度:O(n)。保存两个哈希表需要 O(n) 的空间。
Comments