问题:
题目来源:力扣(LeetCode)
难度:中等
分析:
本题解提供四种方法,分别是python的Counter技巧、堆、桶排序、快排。
对于python语言来说,这道题可以用python技巧一行做完,Counter的计数排序功能太强大。
堆天生适合求前k个最大/最小值。
桶适合计数排序的题目。
快排思想也适合寻找k大、k小元素。
解决方法:
1:Counter技巧
#python技巧
#直接使用Counter计数,直接取频数最大的几位
#collections.Counter(nums).most_common(k)代表取频数最大的k位,key和value打包成元组储存在列表中。
#*代表不确定几位,可有多位
#zip将对应位置元素打包成元组
#打包完后,第0个元素就是要求的,但是zip类型不能直接取,得先变成list,然后取第0位。
import collections
class Solution(object):
def topKFrequent(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
return list(zip(*collections.Counter(nums).most_common(k)))[0]
复杂度:O(nlogn)
2:堆方法
#堆方法
#python维护的是最小堆。频数取反入队。先将所有数据的频数和它本身一起存到堆里。频数取反,这样每一次取到的都是最小值,也就是实际上的最大值。