随机产生数字并传递给一个方法。你能否完成这个方法,在每次产生新值时,寻找当前所有值的中间值(中位数)并保存。
中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。
例如,
[2,3,4] 的中位数是 3
[2,3] 的中位数是 (2 + 3) / 2 = 2.5
设计一个支持以下两种操作的数据结构:
- void addNum(int num) - 从数据流中添加一个整数到数据结构中。
- double findMedian() - 返回目前所有元素的中位数。
示例:
addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3)
findMedian() -> 2
//leetcode submit region begin(Prohibit modification and deletion)
class MedianFinder {
List<Integer> arr;
/** initialize your data structure here. */
public MedianFinder() {
arr = new ArrayList<>();
}
public void addNum(int num) {
if (arr.size() == 0) {
arr.add(num);
return;
}
int start = 0;
int end = arr.size() - 1;
while (start <= end) {
if (start == end) {
if (arr.get(start) > num) {
arr.add(start, num);
} else {
arr.add(start + 1, num);
}
break;
} else if (start + 1 == end) {
if (arr.get(start) > num) {
arr.add(start, num);
} else if (arr.get(end) > num) {
arr.add(end, num);
} else {
arr.add(end + 1, num);
}
break;
} else {
int mid = start + (end - start) / 2;
if (arr.get(mid) < num) {
start = mid;
} else {
end = mid;
}
}
}
}
public double findMedian() {
if (arr.size() == 0) {
return 0.0;
}
if (arr.size() % 2 == 1) {
return (double)(arr.get(arr.size() / 2));
} else {
return (double)(arr.get(arr.size() / 2 - 1) + arr.get(arr.size() / 2)) / 2;
}
}
}
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder obj = new MedianFinder();
* obj.addNum(num);
* double param_2 = obj.findMedian();
*/
//leetcode submit region end(Prohibit modification and deletion)