這題難在于這是一個Data Stream,實時的數(shù)據(jù)嘩啦嘩啦進(jìn)來畸裳,需要run time 非常快的data structure.
蠻力法:【會time out.】
進(jìn)階版:
要怎么能夠做到O(1)的速度呢硼补?首先魏割,排序肯定不可能,O(nlogn)可以直接過濾不考慮礁芦。O(1)的data structure 我知道的有 List, Stack, Heap正勒?【直接從top拿東西】
嗯得院,寫不出來。找答案昭齐。尿招。。
答案非常的繞...大部分的computation 在 addNum里阱驾, findMedian就沒有太多計算就谜。用兩個PriorityQueue來裝東西. 很明顯,Small Queue是按越小的東西擺越上面里覆。 Large Queue是按越大的東西擺越上面丧荐。但是他這里并沒有specify Queue的priority在初始化的過程中,使用的是默認(rèn)款喧枷。
然后用負(fù)號來實現(xiàn)queue的類型虹统。比如說一個最大的數(shù)100弓坞, -100以后就變成了最小的數(shù)。
所以-large.poll() 相當(dāng)于把Large Queue里最小的扔到small Queue里车荔。
然后盡量保持兩個Queue的size一樣大渡冻,一旦不一樣,勻一點到另一個忧便。
【神一樣的腦洞想出的答案】
建議面試中不要使用這種寫法族吻,還是specify queue類型比較好。這種unique的寫法出來就知道是抄的珠增。超歌。
Also, Collections.reverseOrder specify Max Heap.
修改版homemade solution:
最Tricky的兩個點 1. Queue的設(shè)立要符合這個邏輯:
2. 每次添加的時候,先往FirstHalf加一個元素蒂教,然后把FirstHalf里最小的丟給SecondHalf. 我一開始沒寫這個巍举。一直往FirstHalf加的話SecondHalf永遠(yuǎn)沒東西。