leetcode-295-数据流的中位数
题目描述:
方法一:排序 O(nlogn) 超时
class MedianFinder: def __init__(self): """ initialize your data structure here. """ self.list = [] def addNum(self, num: int) -> None: self.list.append(num) def findMedian(self) -> float: if not self.list: return None self.list.sort() if len(self.list) % 2 == 0: return (self.list[len(self.list)//2-1] + self.list[len(self.list)//2])/2 else: return self.list[len(self.list)//2]
方法二:插入排序 O(N)+O(logn)
import bisect class MedianFinder: def __init__(self): """ initialize your data structure here. """ self.list = [] def addNum(self, num: int) -> None: bisect.insort_left(self.list,num) def findMedian(self) -> float: mid = (len(self.list)-1)//2 if len(self.list) % 2 == 0: return (self.list[mid] + self.list[mid+1])/2 else: return self.list[mid]
方法三:两个堆 O(logn)
import heapq class MedianFinder: def __init__(self): """ initialize your data structure here. """ self.min_heap = [] self.max_heap = [] def addNum(self, num: int) -> None: if len(self.min_heap) == len(self.max_heap): heapq.heappush(self.min_heap,-heapq.heappushpop(self.max_heap,-num)) else: heapq.heappush(self.max_heap,-heapq.heappushpop(self.min_heap,num)) def findMedian(self) -> float: if len(self.min_heap) == len(self.max_heap): return (self.min_heap[0] - self.max_heap[0])/2 return self.min_heap[0]
java:
class MedianFinder { Queue<Integer> A,B; /** initialize your data structure here. */ public MedianFinder() { A = new PriorityQueue<>(); B = new PriorityQueue<>((x,y) -> (y - x)); } public void addNum(int num) { if(A.size() != B.size()) { A.add(num); B.add(A.poll()); }else{ B.add(num); A.add(B.poll()); } } public double findMedian() { return A.size() != B.size() ? A.peek() : (A.peek() + B.peek()) / 2.0; } }