• leetcode347 Top K Frequent Elements


     1 """
     2 Given a non-empty array of integers, return the k most frequent elements.
     3 Example 1:
     4 Input: nums = [1,1,1,2,2,3], k = 2
     5 Output: [1,2]
     6 Example 2:
     7 Input: nums = [1], k = 1
     8 Output: [1]
     9 """
    10 """
    11 用dict实现的木桶排序
    12 解法一:木桶+sort
    13 解法二:木桶+heap(堆)
    14 解法三:维护一个n-k的最大堆((有局限性,如果是第k大,会出问题))。此题是前k大的都append里面了
    15 """
    16 class Solution1:
    17     def topKFrequent(self, nums, k):
    18         count_list = dict()
    19         res = []
    20         for num in nums:
    21             count_list[num] = count_list.get(num, 0) + 1
    22         #如果count_list[num]没有value,则value是0,否则是value+1
    23         #dict.get(key, default=None)
    24         #key -- 字典中要查找的键。
    25         #default -- 如果指定键的值不存在时,返回该默认值。
    26         t = sorted(count_list.items(), key=lambda l: l[1], reverse=True)
    27         #sorted(iterable, key=None, reverse=False)  返回的是一个list
    28         #iterable -- 可迭代对象
    29         #key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可         #迭代对象中的一个元素来进行排序。
    30         #lambda 输入l是(key,value),输出l[1]是value. 可以理解l[0]是key
    31         #reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
    32         for i in range(k):
    33             res.append(t[i][0]) # t[i][0]表示第i个tuple的第1个元素,t[i][1]则表示第二个元素
    34         return res
    35 
    36 """
    37 解法二:木桶+heap
    38 python heap
    39 nums = [2, 3, 5, 1, 54, 23, 132]
    40 heap = []
    41 for num in nums:
    42     heapq.heappush(heap, num)  # 第一种加入堆
    43 heapq.heapify(nums)  #第二种生成堆
    44 print([heapq.heappop(heap) for _ in range(len(nums))])  # 堆排序结果
    45 nums = [1, 3, 4, 5, 2]
    46 print(heapq.nlargest(3, nums))   [5, 4, 3]
    47 print(heapq.nsmallest(3, nums))  [1, 2, 3]
    48 """
    49 class Solution2:
    50     def topKFrequent(self, nums, k):
    51         import heapq
    52         count_list = dict()
    53         for num in nums:
    54             count_list[num] = count_list.get(num, 0) + 1
    55         p = list()  #存储堆排序后的结果
    56         for i in count_list.items():
    57             heapq.heappush(p, (i[1], i[0]))  #加入堆,每个结点是个tuple(,)
    58         return [i[1] for i in heapq.nlargest(k, p)] #这里的i[1] 其实是上一行的i[0]
    59 """
    60 堆默认root是最小值
    61 解法三:维护一个n-k的最大堆(有局限性,最大的值最后入堆,会出问题)
    62 最大堆需要将最小堆的值取反
    63 """
    64 class Solution3:
    65     def topKFrequent(self, nums, k):
    66         import heapq
    67         count_list = dict()
    68         for num in nums:
    69             count_list[num] = count_list.get(num, 0) + 1
    70         p = list()
    71         res = list()
    72         for i in count_list.items():
    73             heapq.heappush(p, (-i[1], -i[0])) #bug前面没写heapq
    74             if len(p) > len(count_list) - k:
    75                 _, val = heapq.heappop(p) #bug前面没写heapq
    76                 res.append(-val)
    77         return res
  • 相关阅读:
    linux Segmentation faults 段错误详解
    linux cut
    linux sed
    linux tr
    linux ar
    objdump--反汇编查看
    linux中dd命令
    readelf
    登录后,前端做了哪些工作,如何得知已登录?
    正向代理和反向代理?
  • 原文地址:https://www.cnblogs.com/yawenw/p/12329284.html
Copyright © 2020-2023  润新知