面试题64. 数据流中的中位数
2017-06-28 10:02
253 查看
题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
思路1:
用Partition算法,找到中位数,详细见这篇博文
思路2:
采用插入排序的方法,每读取一个数字时,用插入排序让数组保持排序状态,需要O(n2)
但是在求中位数时,只需要O(1)。Java中可以借用LinkedList实现插入排序
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
思路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)); } }
相关文章推荐
- 剑指offer面试题[64]-数据流中的中位数
- 面试题_64——数据流中的中位数
- 剑指offer-面试题64:数据流中的中位数
- 《剑指offer》面试题64 数据流中的中位数
- 【剑指Offer】面试题64:数据流中的中位数
- 剑指offer 面试题64 数据流的中位数
- 剑指offer 面试题64 数据流中的中位数
- 面试题64 数据流中的中位数
- 面试题64:数据流中的中位数
- 【面试题64】数据流中的中位数
- 面试题64:数据流中的中位数
- 《剑指Offer》学习笔记--面试题64:数据流中的中位数
- 剑指offer面试题64 数据流中的中位数(Java实现)
- 剑指offer-面试题64-数据流中的中位数
- 面试题64:数据流中的中位数
- 剑指offer——面试题64:数据流中的中位数
- 剑指offer--面试题64:数据流中的中位数
- 【剑指Offer学习】【面试题64:数据流中的中位数】
- 64 - 数据流中的中位数 || STL 堆
- 【剑指offer】面试题41:数据流的中位数