基本把论文搞好啦 加上出去玩了玩 重新开始学习~!
1、leetcode215 数组中第k大元素 (最小堆)
import heapq
class Solution(object):
def findKthLargest(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
heap = []
l=0
for i in nums:
if l <k:
heapq.heappush(heap,i)
l +=1
else:
if i>heap[0]:
heapq.heappop(heap)
heapq.heappush(heap,i)
return heap[0]
同时记录一下heapq模块常见的方法:
- heap = []#建立一个常见的堆
- heappush(heap,item)#往堆中插入一条新的值
- item = heappop(heap)#弹出最小的值
- item = heap[0]#查看堆中最小的值,不弹出
- heapify(x)#以线性时间将一个列表转为堆
- item = heapreplace(heap,item)#弹出一个最小的值,然后将item插入到堆当中。堆的整体的结构不会发生改变。
- heappoppush()#弹出最小的值,并且将新的值插入其中
- merge()#将多个堆进行合并
- nlargest(n , iterbale, key=None)从堆中找出做大的N个数,key的作用和sorted( )方法里面的key类似,用列表元素的某个属性和函数作为关键字
2、leetcode295 动态维护数据流中位数
设计一个支持以下两种操作的数据结构:
void addNum(int num) - 从数据流中添加一个整数到数据结构中。
double findMedian() - 返回目前所有元素的中位数。
from heapq import *
class MedianFinder(object):
def __init__(self):
"""
initialize your data structure here.
"""
self.maxh = []
self.minh=[]
self.len = 0
def addNum(self, num):
"""
:type num: int
:rtype: None
"""
if not self.maxh:
heappush(self.maxh,-num)
return
if len(self.maxh) == len(self.minh):
if num > -self.maxh[0]:
heappush(self.minh,num)
else:
heappush(self.maxh,-num)
elif len(self.maxh) > len(self.minh):
if num > -self.maxh[0]:
heappush(self.minh,num)
else:
item = -heappop(self.maxh)
heappush(self.maxh,-num)
heappush(self.minh,item)
else:
if num < self.minh[0]:
heappush(self.maxh,-num)
else:
item = heappop(self.minh)
heappush(self.minh,num)
heappush(self.maxh,-item)
return
def findMedian(self):
"""
:rtype: float
"""
l1 = len(self.maxh)
l2 = len(self.minh)
if l1 == l2:
return (-self.maxh[0]+self.minh[0])/2.
elif l1 > l2:
return -self.maxh[0]
return self.minh[0]
# Your MedianFinder object will be instantiated and called as such:
# obj = MedianFinder()
# obj.addNum(num)
# param_2 = obj.findMedian()
主要是注意python没有最大堆,要在插入和取出的时候都取负数。