时间:2020-05-27
题目地址:https://leetcode-cn.com/problems/kth-largest-element-in-a-stream/
题目难度:Easy
题目描述:
设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。
你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第K大的元素。
示例:
int k = 3;
int[] arr = [4,5,8,2];
KthLargest kthLargest = new KthLargest(3, arr);
kthLargest.add(3); // returns 4
kthLargest.add(5); // returns 5
kthLargest.add(10); // returns 5
kthLargest.add(9); // returns 8
kthLargest.add(4); // returns 8
说明:
你可以假设 nums 的长度≥ k-1 且k ≥ 1。
思路1:加一个元素,排个序,始终保持有序
代码段1:通过
class KthLargest:
def __init__(self, k: int, nums: List[int]):
self.k = k
self.nums = nums
def add(self, val: int) -> int:
self.nums.append(val)
self.nums.sort()
return self.nums[-self.k]
# Your KthLargest object will be instantiated and called as such:
# obj = KthLargest(k, nums)
# param_1 = obj.add(val)
总结:
- 这种方式时间复杂度O(n*n*logn)
思路2:使用堆维护一个k大的列表sorted
代码段2:超时,9/10,后续看下怎么优化吧
import heapq
class KthLargest:
def __init__(self, k: int, nums: List[int]):
self.k = k
self.nums = nums
def add(self, val: int) -> int:
self.nums.append(val)
_heap = list(self.nums)
heapq.heapify(_heap)
_heap = heapq.nlargest(self.k, _heap)
self.nums = _heap
return _heap[-1]
总结:
- 这种方式时间复杂度O(n*k*logk)
思路3:使用堆维护一个size = k的堆,小顶堆,最小值永远在堆顶
代码段3:通过
import heapq
class KthLargest:
def __init__(self, k: int, nums: List[int]):
self.pool = heapq.nlargest(k, nums)[::-1]
self.k = k
def add(self, val: int) -> int:
if(len(self.pool) < self.k): # 判断小顶堆的size 是否是 k
heapq.heappush(self.pool, val)
elif(val > self.pool[0]): #判断小顶堆的堆顶元素是否小于val,是的话需要调整堆
heapq.heapreplace(self.pool, val)
return self.pool[0]
总结:
- 这种方式时间复杂度O(n*(1 or log2 k)) = O(n*log2 k)
- heap模块的用法
Usage:
heap = [] # creates an empty heap
heappush(heap, item) # pushes a new item on the heap
item = heappop(heap) # pops the smallest item from the heap
item = heap[0] # smallest item on the heap without popping it
heapify(x) # transforms list into a heap, in-place, in linear time
item = heapreplace(heap, item) # pops and returns smallest item, and adds new item; the heap size is unchanged