二分法实现
-
- [295. 数据流的中位数](#295. 数据流的中位数)
295. 数据流的中位数
- 本题的第一个难点,要自己构造一个类(因为个人构造类的题目做的较少)
属性: 数组的长度int 数组的数据结构 List
- 保证原数组是一个有序数组,我使用了二分查找插入新元素。(类似于35.搜索插入位置)
① 当前数据结构没有元素时,直接插入数据结构尾部
② 当要插入的元素大于数据结构中最后一个元素时,直接插入数据结构的尾部。
③ 其他的元素按照二分查找的方法插入数据结构中,List 的 add(position, num)方法。
- 没学会大小堆。。。。先用我的垃圾方法得了
java
复制代码
class MedianFinder {
int size;
List<Integer> lis;
public MedianFinder() {
size = 0;
lis = new ArrayList<>();
}
// 要保持原数组的有序插入
// 二分法查找插入
public void addNum(int num) {
int left = 0;
int right = size-1;
if(size == 0){
lis.add(num);
size++;
return;
}
if( num > lis.get(right)){
lis.add(num);
size++;
return;
}
int middle = 0;
while(left <= right){
middle = left + (right - left)/2;
if(lis.get(middle) > num){
right = middle - 1;
}
else if(lis.get(middle) < num){
left = middle + 1;
}
else{
lis.add(middle, num);
size++;
return;
}
}
lis.add(left, num);
size++;
// 用于打印测试
// for(int tmp: lis){
// System.out.println(tmp);
// }
// System.out.println("*");
}
public double findMedian() {
double median = 0.0;
if(size % 2 == 1){
median = lis.get(size/2);
}
else{
median = (lis.get((size-1)/2)+lis.get(size/2))/2.0;
}
return median;
}
}