Find Median From Data Stream[Hard]

这题难在于这是一个Data Stream,实时的数据哗啦哗啦进来,需要run time 非常快的data structure.

Find Median From Data Stream[Hard]_第1张图片

蛮力法:【会time out.】

Find Median From Data Stream[Hard]_第2张图片

进阶版:

要怎么能够做到O(1)的速度呢?首先,排序肯定不可能,O(nlogn)可以直接过滤不考虑。O(1)的data structure 我知道的有 List, Stack, Heap?【直接从top拿东西】


嗯,写不出来。找答案。。。

答案非常的绕...大部分的computation 在 addNum里, findMedian就没有太多计算。用两个PriorityQueue来装东西. 很明显,Small Queue是按越小的东西摆越上面。 Large Queue是按越大的东西摆越上面。但是他这里并没有specify Queue的priority在初始化的过程中,使用的是默认款。

然后用负号来实现queue的类型。比如说一个最大的数100, -100以后就变成了最小的数。

所以-large.poll() 相当于把Large Queue里最小的扔到small Queue里。

然后尽量保持两个Queue的size一样大,一旦不一样,匀一点到另一个。

【神一样的脑洞想出的答案】


建议面试中不要使用这种写法,还是specify queue类型比较好。这种unique的写法出来就知道是抄的。。

Also, Collections.reverseOrder specify Max Heap.

Find Median From Data Stream[Hard]_第3张图片


修改版homemade solution:

Find Median From Data Stream[Hard]_第4张图片

最Tricky的两个点 1. Queue的设立要符合这个逻辑:


Find Median From Data Stream[Hard]_第5张图片

2. 每次添加的时候,先往FirstHalf加一个元素,然后把FirstHalf里最小的丢给SecondHalf. 我一开始没写这个。一直往FirstHalf加的话SecondHalf永远没东西。

你可能感兴趣的:(Find Median From Data Stream[Hard])