LeetCode 前K个高频元素

LeetCode  前K个高频元素

给定一个非空的整数数组,返回其中出现频率前 高的元素。

例如,

给定数组 [1,1,1,2,2,3] , 和 k = 2,返回 [1,2]

注意:

  • 你可以假设给定的 总是合理的,1 ≤ k ≤ 数组中不相同的元素的个数。
  • 你的算法的时间复杂度必须优于 O(n log 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)]

 

posted @ 2018-07-11 14:02  卉卉卉大爷  阅读(767)  评论(0编辑  收藏  举报