-
Notifications
You must be signed in to change notification settings - Fork 21.1k
Expand file tree
/
Copy pathFindMedianfromDataStream.java
More file actions
57 lines (43 loc) · 1.71 KB
/
FindMedianfromDataStream.java
File metadata and controls
57 lines (43 loc) · 1.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import java.util.*;
public class MedianFinder {
private PriorityQueue<Integer> maxHeap; // left half (small)
private PriorityQueue<Integer> minHeap; // right half (larger)
public MedianFinder() {
// Max-heap stores the smaller half
maxHeap = new PriorityQueue<>(Collections.reverseOrder());
// Min-heap stores the larger half
minHeap = new PriorityQueue<>();
}
public void addNum(int num) {
// Step 1: Add to maxHeap
maxHeap.offer(num);
// Step 2: Balance heaps (ensure all in maxHeap <= all in minHeap)
minHeap.offer(maxHeap.poll());
// Step 3: Maintain size property (maxHeap can be larger by 1)
if (maxHeap.size() < minHeap.size()) {
maxHeap.offer(minHeap.poll());
}
}
public double findMedian() {
if (maxHeap.size() == minHeap.size()) {
// Even number of elements → average of two middles
return (maxHeap.peek() + minHeap.peek()) / 2.0;
} else {
// Odd → top of maxHeap
return maxHeap.peek();
}
}
public static void main(String[] args) {
MedianFinder mf = new MedianFinder();
mf.addNum(1);
System.out.println("After adding 1, Median = " + mf.findMedian());
mf.addNum(2);
System.out.println("After adding 2, Median = " + mf.findMedian());
mf.addNum(3);
System.out.println("After adding 3, Median = " + mf.findMedian());
mf.addNum(4);
System.out.println("After adding 4, Median = " + mf.findMedian());
mf.addNum(5);
System.out.println("After adding 5, Median = " + mf.findMedian());
}
}