题目:原题链接(困难)
标签:哈希表、数学
解法 | 时间复杂度 | 空间复杂度 | 执行用时 |
Ans 1 (Python) | – | – | 超出时间限制 |
Ans 2 (Python) | O ( N l o g N ) | O ( N ) | 160ms (81.02%) |
Ans 3 (Python) |
解法一:
class Solution:
def maxEqualFreq(self, nums: List[int]) -> int:
size = len(set(nums))
count1 = collections.Counter()
count2 = collections.Counter({0: size})
ans = 1
for i, n in enumerate(nums):
count2[count1[n]] -= 1
count1[n] += 1
count2[count1[n]] += 1
lst1 = [v for k, v in count2.items() if k != 0 and v != 0]
lst2 = [k for k, v in count2.items() if k != 0 and v != 0]
# print(i, ":", count1, count2, "->", lst1, lst2)
# 如果当前所有的数出现次数都是相同的
if len(lst1) == 1:
# 如果它们每个数的出现次数不是1
if lst1[0] != 1:
# 那么如果它们不只1个数,则无法实现
if lst2[0] != 1:
continue
# 如果当前所有的数有两种不同的出现次数
if len(lst1) == 2:
# 如果出现少的一个次数不是一次,则无法实现
if min(lst1) != 1:
continue
# 如果当前所有的数有三种不同的出现次数,则注定无法实现
if len(lst1) > 2:
continue
ans = max(ans, i + 1)
return ans
解法二:
class Solution:
def maxEqualFreq(self, nums: List[int]) -> int:
nums += [inf]
count = collections.Counter(nums)
# 从后往前遍历
for i in reversed(range(len(nums))):
count[nums[i]] -= 1
lst = sorted(filter(lambda x: x > 0, count.values())) # 剔除掉是0的出现频率
if len(lst) == 1 or (lst[0] == 1 and lst[1] == lst[-1]) or (lst[0] == lst[-2] == lst[-1] - 1):
return i