Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 4b99783

Browse files
solves runnin median
1 parent a314495 commit 4b99783

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package heap;
2+
3+
import java.util.Comparator;
4+
import java.util.PriorityQueue;
5+
import java.util.Queue;
6+
import java.util.Scanner;
7+
8+
public class FindTheRunningMedian {
9+
private static final Scanner scanner = new Scanner(System.in);
10+
11+
public static void main(String[] args) {
12+
int length = scanner.nextInt();
13+
int[] array = getArray(length);
14+
printMedians(array);
15+
}
16+
17+
private static int[] getArray(int length) {
18+
int[] array = new int[length];
19+
for (int index = 0 ; index < array.length ; index++) {
20+
array[index] = scanner.nextInt();
21+
}
22+
return array;
23+
}
24+
25+
private static void printMedians(int[] array) {
26+
Queue<Integer> lowerHalf = new PriorityQueue<>(Comparator.reverseOrder());
27+
Queue<Integer> upperHalf = new PriorityQueue<>();
28+
for (int number : array) {
29+
addToHeap(lowerHalf, upperHalf, number);
30+
redolenceHeaps(lowerHalf, upperHalf);
31+
double median = getMedian(lowerHalf, upperHalf);
32+
System.out.println(String.format("%.1f", median));
33+
}
34+
}
35+
36+
private static void addToHeap(Queue<Integer> lowerHalf, Queue<Integer> upperHalf, int number) {
37+
if (lowerHalf.isEmpty() || number < lowerHalf.peek()) {
38+
lowerHalf.add(number);
39+
} else {
40+
upperHalf.add(number);
41+
}
42+
}
43+
44+
private static void redolenceHeaps(Queue<Integer> lowerHalf, Queue<Integer> upperHalf) {
45+
Queue<Integer> larger = lowerHalf.size() < upperHalf.size() ? upperHalf : lowerHalf ;
46+
Queue<Integer> smaller = lowerHalf.size() < upperHalf.size() ? lowerHalf : upperHalf ;
47+
48+
while (larger.size() - smaller.size() >= 2) {
49+
smaller.add(larger.poll());
50+
}
51+
}
52+
53+
private static double getMedian(Queue<Integer> lowerHalf, Queue<Integer> upperHalf) {
54+
if (lowerHalf.size() == upperHalf.size()) {
55+
return ((double) lowerHalf.peek() + upperHalf.peek()) / 2;
56+
} else {
57+
return lowerHalf.size() > upperHalf.size() ? lowerHalf.peek() : upperHalf.peek();
58+
}
59+
}
60+
}

0 commit comments

Comments
(0)

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /