面试题64. 数据流中的中位数

来源:互联网 发布:fedora dnf和yum 编辑:程序博客网 时间:2024/04/18 09:29

题目描述

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。

思路1:
Partition算法,找到中位数,详细见这篇博文

思路2:
采用插入排序的方法,每读取一个数字时,用插入排序让数组保持排序状态,需要O(n2)
但是在求中位数时,只需要O(1)。Java中可以借用LinkedList实现插入排序

import java.util.LinkedList;public class Solution {    private LinkedList<Integer> list = new LinkedList<>();    /**     * 将数据插入到LinkedList中     */    public void Insert(Integer num) {        if(list.isEmpty() || num < list.getFirst()) {            list.addFirst(num);        }else {            boolean insertSuccess = false;            for(Integer i : list) {                if(num < i) {                    int index = list.indexOf(i);                    list.add(index, num);                    insertSuccess = true;                    break;                }            }            if(!insertSuccess) {                list.addLast(num);            }        }    }    /*     * 获取中位数     */    public Double GetMedian() {        if(list.isEmpty()) {            return null;        }        int mid = list.size() / 2;        // 如果长度是偶数        if((list.size() & 1) == 0) {                        Integer first = list.get(mid - 1);            Integer second = list.get(mid);            return Double.valueOf(first + second) / 2.0;        }        return Double.valueOf(list.get(mid));          }}
原创粉丝点击