排序(2)
十种排序算法复杂度
-出现频率最高的前k个元素
1.使用字典,统计每个元素出现的次数,元素为键,元素出现的次数为值。2.将频率作为数组下标,对于出现频率不同的数字集合,存入对应的下标。3.倒序遍历数组获取出现顺序从大到小的排列。
这里用python3实现桶排序,是自己想着写的,不是很完美,但是可以通过。
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
res = [[] for i in range(len(nums) + 1)]
dic = {}
for i in nums:
dic[i] = dic.get(i, 0) + 1
for num, times in dic.items():
res[times].append(num)
t = 0
ans = []
for i in range(len(nums), 0, -1):
if res[i]!=[]:
t +=len(res[i])
ans.extend(res[i]) # extend() 函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
if t == k:
return ans
时间复杂度O(n):n表示列表的长度,首先遍历一遍,统计元素的频率,这一操作为O(n);桶排序的数量是n+1,所以为O(n)。因此,总的O(n)。
空间复杂度O(n):桶的大小。