2021年9月12日23:08:55
import java.util.*; public class Solution { ArrayList <Integer> A; int len = 0; public Solution() { A = new ArrayList <>(); // 数组 } public void Insert(Integer num) { int i =0; for(; i< len; i++){ if(num < A.get(i) ) {A.add(i,num);break;} //找到对应的位置 插入 } if(i==len) A.add(num);//比所有数都大 加入到末尾 len++; } public Double GetMedian() { if(len%2 == 1){ return A.get((len-1)/2)/1.0; } else{ return (A.get(len/2) + A.get(len/2-1)) /2.0; } } }
2.
首先 最简单 对数组排序 然后 寻找中位数
但是每次增加数都需要 把整个数组向右移动
因此可以使用 堆排序 把 整个数从中间分开
小的部分 使用大跟堆 选出最大值
大的部分 使用小根堆 选出最小值
每次堆中增加的时候 两个堆交替进行,
例如向大跟堆中 添加 那么从小根堆中选出大的部分的最小值 加入到大跟堆
这样保证 大的部分的最小值 也比小的部分的最大值要大 实现了对数组的排序。
import java.util.*; public class Solution { Queue<Integer> A, B; public Solution() { A = new PriorityQueue<>(); // 小顶堆,保存较大的一半 B = new PriorityQueue<>((x, y) -> (y - x)); // 大顶堆,保存较小的一半 } public void Insert(Integer num) { if(A.size() != B.size()){ //向B加入 A.add(num); B.add(A.poll()); }else{// 向A加入 B.add(num); A.add(B.poll()); } } public Double GetMedian() { return A.size() != B.size() ? A.peek()/1.0 : (A.peek()+B.peek())/2.0; } }