This repository was archived by the owner on Dec 12, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 501
Expand file tree
/
Copy pathMedianIntegerStream.java
More file actions
117 lines (102 loc) · 2.51 KB
/
Copy pathMedianIntegerStream.java
File metadata and controls
117 lines (102 loc) · 2.51 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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
public class MedianIntegerStream {
/**
* This solution is a replica of the one suggested in javascript solutions
* for MedianIntegerStream, and I think its one of the best possible solutions.
*/
MyLinkedList ll;
public MedianIntegerStream() {
// TODO Auto-generated constructor stub
ll = new MyLinkedList();
}
public static void main(String[] args) {
MedianIntegerStream mis = new MedianIntegerStream();
System.out.println("Median: " + mis.ll.insertIntoLL(10));
System.out.println("Median: " + mis.ll.insertIntoLL(15));
System.out.println("Median: " + mis.ll.insertIntoLL(25));
System.out.println("Median: " + mis.ll.insertIntoLL(5));
}
public class MyLinkedList {
Node median;
int leftNodes;
int rightNodes;
public MyLinkedList() {
median = null;
leftNodes = 0;
rightNodes = 0;
}
public MyLinkedList(Node median) {
this.median = median;
leftNodes = 0;
rightNodes = 0;
}
public class Node {
Integer value;
Node left;
Node right;
Node() {
value = null;
left = null;
right = null;
}
Node(int value) {
this.value = value;
left = null;
right = null;
}
Node(int value, Node left, Node right) {
this.value = value;
this.left = left;
this.right = right;
}
}
public void prepend(int value) {
Node cur = median;
while (cur.left != null && cur.left.value > value)
cur = cur.left;
Node newNode = new Node(value, cur.left, cur);
if (cur.left != null)
cur.left.right = newNode;
cur.left = newNode;
leftNodes++;
updateMedian();
}
public void append(int value) {
Node cur = median;
while (cur.right != null && cur.right.value < value)
cur = cur.right;
Node newNode = new Node(value, cur, cur.right);
if (cur.right != null)
cur.right.left = newNode;
cur.right = newNode;
rightNodes++;
updateMedian();
}
public void updateMedian() {
if (this.leftNodes - this.rightNodes > 1) {
median = median.left;
rightNodes++;
leftNodes--;
} else if (this.rightNodes - this.leftNodes > 1) {
median = median.right;
leftNodes++;
rightNodes--;
}
}
public int insertIntoLL(int value) {
if (median == null) {
median = new Node(value);
} else {
if (value <= median.value)
prepend(value);
else
append(value);
}
if (this.leftNodes == this.rightNodes)
return median.value;
else if (leftNodes < rightNodes)
return (median.value + median.right.value) / 2;
else
return (median.value + median.left.value) / 2;
}
}
}