📅  最后修改于: 2023-12-03 15:37:16.299000             🧑  作者: Mango
给定n
个整数和一个整数k
,找到这n
个整数中至少出现了k
次的元素,并按照其出现次数排序。如果出现次数相等,则它们应按插入顺序排序。
def k_frequency(arr: List[int], k: int) -> List[Tuple[int, int]]:
pass
arr
:长度为n (1 ≤ n ≤ 10^5),表示n个整数的列表。k
:一个整数 (1 ≤ k ≤ n)输入:
arr = [3, 1, 4, 4, 5, 2, 6, 1]
k = 2
输出:
[(4, 2), (1, 2)]
在给定的列表中,数字1
和4
至少出现了2次。
本问题可以分解为以下几个步骤:
为统计每个元素出现的次数,我们可以使用python内置的Counter
工具。
from collections import Counter
def k_frequency(arr: List[int], k: int) -> List[Tuple[int, int]]:
counter = Counter(arr)
print(counter)
得到统计结果:
Counter({4: 2, 1: 2, 3: 1, 5: 1, 2: 1, 6: 1})
按出现次数递减排序,我们可以对前面得到的Counter
结果进行排序。
from collections import Counter
def k_frequency(arr: List[int], k: int) -> List[Tuple[int, int]]:
counter = Counter(arr)
counts = sorted(counter.items(), key=lambda x: x[1], reverse=True)
print(counts)
得到排序结果:
[(4, 2), (1, 2), (3, 1), (5, 1), (2, 1), (6, 1)]
如果出现次数相同,则按它们在原始列表中的顺序进行排序。
from collections import Counter
from typing import List, Tuple
def k_frequency(arr: List[int], k: int) -> List[Tuple[int, int]]:
counter = Counter(arr)
counts = sorted(counter.items(), key=lambda x: (-x[1], arr.index(x[0])))
result = []
for i, (val, count) in enumerate(counts):
if count < k:
break
result.append((val, count))
return result
本算法的时间复杂度为$O(nlogn)$,其中n为元素个数。
空间复杂度为$O(n)$,主要用于存储元素出现的次数。