LintCode 545 [Top k Largest Number II]

原题

实现一个数据结构,提供下面两个接口
1.add(number) 添加一个元素
2.topk() 返回前K大的数

样例

s = new Solution(3);
>> create a new data structure.
s.add(3)
s.add(10)
s.topk()
>> return [10, 3]
s.add(1000)
s.add(-99)
s.topk()
>> return [1000, 10, 3]
s.add(4)
s.topk()
>> return [1000, 10, 4]
s.add(100)
s.topk()
>> return [1000, 100, 10]

解题思路

  • 内部维护一个大小为k的最小堆
  • 如果size < k则直接将num加入到minHeap
  • 如果size >= k, 则比较num与minHeap中的最小值,若小于最小值则忽略,大于最小值则删除最小值,并把num加入到minHeap
  • 每次返回minHeap数组,返回时先反向排序
sorted(nums, reverse=True)

完整代码

import Queue

class Solution:

    # @param {int} k an integer
    def __init__(self, k):
        # initialize your data structure here.
        self.size = k
        self.minHeap = Queue.PriorityQueue()

        
    # @param {int} num an integer
    def add(self, num):
        # Write your code here
        if self.minHeap.qsize() < self.size:
            self.minHeap.put(num)
        elif num > self.minHeap.queue[0]:
            self.minHeap.get()
            self.minHeap.put(num)


    # @return {int[]} the top k largest numbers
    def topk(self):
        # Write your code here
        return sorted(self.minHeap.queue, reverse=True)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,769评论 0 33
  • LeetCode 刷题随手记 - 第一部分 前 256 题(非会员),仅算法题,的吐槽 https://leetc...
    蕾娜漢默阅读 17,909评论 2 36
  • [ 80 questions / 3 ~= 27 a month..ok.. ] 1.29: remove_dup...
    陈十十阅读 522评论 0 1
  • 1. tf函数 tensorflow 封装的工具类函数 | 操作组 | 操作 ||:-------------| ...
    南墙已破阅读 5,227评论 0 5
  • 清时节雨纷纷。窗外阴雨绵绵,竟特别想念家乡的艾糍,记得儿时的我一看到那翠绿的颜色,就垂涎三尺,一口咬下去,所有的味...
    lilycat阅读 244评论 0 1