LeetCode 前K个高频元素
LeetCode 前K个高频元素
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
例如,
给定数组 [1,1,1,2,2,3]
, 和 k = 2,返回 [1,2]
。
注意:
- 你可以假设给定的 k 总是合理的,1 ≤ k ≤ 数组中不相同的元素的个数。
- 你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。
1. 桶排序
时间复杂度O(n)
1. 遍历数组nums,利用字典cntDict统计各元素出现次数。
2. 遍历cntDict,利用嵌套列表freqList记录出现次数为i( i∈[1, n] )的所有元素
3. 逆序遍历freqList,将其中的前k个元素输出。
defaultdict的使用!
1 from collections import defaultdict 2 class Solution(object): 3 def topKFrequent(self, nums, k): 4 """ 5 :type nums: List[int] 6 :type k: int 7 :rtype: List[int] 8 """ 9 n = len(nums) 10 cntDict = defaultdict(int) 11 for i in nums: 12 cntDict[i] += 1 13 print(cntDict) 14 freqList = [[] for i in range(n + 1)] 15 for p in cntDict: 16 freqList[cntDict[p]] += p, 17 print(freqList) 18 ans = [] 19 #最多出现n次,从n...1 20 for p in range(n, 0, -1): 21 ans += freqList[p] 22 return ans[:k]
使用字典。
sorted 语法:
sorted(iterable[, cmp[, key[, reverse]]])
参数说明:
- iterable -- 可迭代对象。
- cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
- key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
- reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
dic.items()
返回可遍历的(键, 值) 元组数组。
key=lambda item: item[1]
lambda是一个隐函数,是固定写法,不要写成别的单词;item表示列表中的一个元素,在这里,表示一个元组,item只是临时起的一个名字,你可以使用任意的名字;item[0]表示元组里的第一个元素,当然第二个元素就是item[1];所以这句命令的意思就是按照列表中第一个元素排序
从小到大排序时 reverse=False,从大到小排序是True!
1 class Solution: 2 def topKFrequent(self, nums, k): 3 """ 4 :type nums: List[int] 5 :type k: int 6 :rtype: List[int] 7 """ 8 dic = {} 9 for key in nums: 10 if key not in dic.keys(): 11 dic[key] = 1 12 else: 13 dic[key] += 1 14 print(dic) 15 #对字典进行排序,按照第二个元素 16 item = sorted(dic.items(),key = lambda x:x[1],reverse=True) 17 print(item) 18 return [item[i][0] for i in range(k)]