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;
    }
}

 

posted @ 2019-10-16 16:17  oldby  阅读(151)  评论(0编辑  收藏  举报