Find Median from Data Stream
分析Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two middle value.
Examples:
[2,3,4] , the median is 3[2,3], the median is (2 + 3) / 2 = 2.5
Design a data structure that supports the following two operations:
void addNum(int num) - Add a integer number from the data stream to the data structure.
double findMedian() - Return the median of all elements so far.
For example:
add(1) add(2) findMedian() -> 1.5 add(3) findMedian() -> 2
這道題的經(jīng)典做法就是維護(hù)兩個(gè)Heap, 一個(gè)MaxHeap, 一個(gè)MinHeap,維護(hù)他們的size,比如保證
MaxHeap.size() - MinHeap.size() >= 1
當(dāng)然這種題可以有些follow up, 比如:
除了heap做,還有什么其他方法?
BST可以,比如可以在Node里增加一個(gè)size表示整個(gè)children的數(shù)量,findMedian時(shí)間復(fù)雜度會(huì)增加到log(n);
如果是找比如處在1/10th的元素,怎么找?
同樣可以用兩個(gè)heap做,維護(hù)一個(gè)的size是另一個(gè)size的1/9即可。
time: addNum -> O(log(n)), findMedian -> O(1)
space: O(n)
class MedianFinder { // Adds a number into the data structure. PriorityQueueminHeap = new PriorityQueue (); PriorityQueue maxHeap = new PriorityQueue (Collections.reverseOrder()); public void addNum(int num) { maxHeap.add(num); minHeap.add(maxHeap.remove()); // 維護(hù)兩個(gè)heap的size if (minHeap.size() > maxHeap.size()) maxHeap.add(minHeap.remove()); } // Returns the median of current data stream public double findMedian() { if (maxHeap.size() == minHeap.size()) return (maxHeap.peek() + minHeap.peek()) / 2.0; else return maxHeap.peek(); } }; // Your MedianFinder object will be instantiated and called as such: // MedianFinder mf = new MedianFinder(); // mf.addNum(1); // mf.findMedian();
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/65328.html
摘要:思路和代碼這里采用了兩個(gè)優(yōu)先隊(duì)列來(lái)實(shí)現(xiàn)。一個(gè)優(yōu)先隊(duì)列用來(lái)存儲(chǔ)字符流中較小的一半,另一個(gè)用來(lái)存儲(chǔ)字符流中數(shù)值較大的一半。這樣當(dāng)需要獲取當(dāng)前中位數(shù)時(shí),就可以根據(jù)當(dāng)前的數(shù)值個(gè)數(shù)選擇一個(gè)或是兩個(gè)數(shù)的平均值。 題目要求 Median is the middle value in an ordered integer list. If the size of the list is even, t...
摘要:建立兩個(gè)堆,一個(gè)堆就是本身,也就是一個(gè)最小堆另一個(gè)要寫(xiě)一個(gè),使之成為一個(gè)最大堆。我們把遍歷過(guò)的數(shù)組元素對(duì)半分到兩個(gè)堆里,更大的數(shù)放在最小堆,較小的數(shù)放在最大堆。同時(shí),確保最大堆的比最小堆大,才能從最大堆的頂端返回。 Problem Numbers keep coming, return the median of numbers at every time a new number a...
摘要:最大堆存的是到目前為止較小的那一半數(shù),最小堆存的是到目前為止較大的那一半數(shù),這樣中位數(shù)只有可能是堆頂或者堆頂兩個(gè)數(shù)的均值。我們將新數(shù)加入堆后,要保證兩個(gè)堆的大小之差不超過(guò)。最大堆堆頂大于新數(shù)時(shí),說(shuō)明新數(shù)將處在所有數(shù)的下半部分。 Data Stream Median 最新更新:https://yanjia.me/zh/2019/02/... Median is the middle v...
摘要:題目鏈接這題和那道比起來(lái)多加了個(gè)。還是用兩個(gè)來(lái)做,這個(gè)操作復(fù)雜度用了。和,在保存較小的一半元素,保存較大的一半元素,,注意寫(xiě)的時(shí)候不能用,因?yàn)榭赡堋](méi)想出來(lái)其他方法,參考的解法 480. Sliding Window Median 題目鏈接:https://leetcode.com/problems... 這題和那道Find Median from Data Stream比起來(lái)多加了個(gè)...
摘要:窗口前進(jìn),刪隊(duì)首元素保證隊(duì)列降序加入當(dāng)前元素下標(biāo)從開(kāi)始,每一次循環(huán)都將隊(duì)首元素加入結(jié)果數(shù)組 Sliding Window Maximum Problem Given an array of n integer with duplicate number, and a moving window(size k), move the window at each iteration fro...
閱讀 2633·2021-11-25 09:43
閱讀 2735·2021-11-04 16:09
閱讀 1652·2021-10-12 10:13
閱讀 889·2021-09-29 09:35
閱讀 887·2021-08-03 14:03
閱讀 1781·2019-08-30 15:55
閱讀 2997·2019-08-28 18:14
閱讀 3498·2019-08-26 13:43