无序数组中求中位数
来源:互联网 发布:安卓手机优化软件 知乎 编辑:程序博客网 时间:2024/06/16 02:57
题目
现有一些随机生成的数字要将其依次传入,请设计一个高效算法,对于每次传入一个数字后,算出当前所有传入数字的中位数。(若传入了偶数个数字则令中位数为第n/2小的数字,n为已传入数字个数)。
给定一个int数组A,为传入的数字序列,同时给定序列大小n,请返回一个int数组,代表每次传入后的中位数。保证n小于等于1000。
测试样例:
[1,2,3,4,5,6],6返回:[1,1,2,2,3,3]
思路
中位数的概念:
中位数(又称中值,英语:Median),统计学中的专有名词,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。
解题思路:
- 通过最大堆、最小堆来实现实时中位数的获取。
- 最大堆中存放比最小堆小的元素。
- 如果最大堆的对头元素大于最小堆,则进行交换。
- 偶数下标的元素存入最小堆,奇数下标的元素存入最大堆。
实现代码
public class Middle { public int[] getMiddle(int[] A, int n) { // write code here int[] res = new int[A.length]; // 构造最大堆 Comparator<Integer> comparator = new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } }; PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(n, comparator); // 构造最小堆 PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(n); for (int i = 0; i < n; i++) { if (i % 2 == 0) { // 存入最小堆前判断当前元素是否小于最大堆的堆顶元素 if (!maxHeap.isEmpty() && A[i] < maxHeap.peek()) { minHeap.offer(maxHeap.poll()); maxHeap.offer(A[i]); } else { minHeap.offer(A[i]); } res[i] = minHeap.peek(); } else { // 存入最大堆之前判断当前元素是否大于最小堆的堆顶元素 if (!minHeap.isEmpty() && A[i] > minHeap.peek()) { maxHeap.offer(minHeap.poll()); minHeap.offer(A[i]); } else { maxHeap.offer(A[i]); } res[i] = maxHeap.peek(); } } return res; }}
阅读全文
1 0
- 无序数组中求中位数
- 【算法】无序数组中求中位数
- 求无序数组的中位数
- 求无序数组的中位数
- 求无序数组的中位数
- 求无序数组的中位数
- 求无序数组的中位数
- 无序数组中找到中位数
- 求无序数组的中位数(转载)
- 求一个无序数组的中位数
- 求一个无序数组的中位数
- 求一个无序数组的中位数。
- 求一个无序数组的中位数
- 求一个无序数组的中位数
- 求一个无序数组的中位数
- 求一个无序数组的中位数
- O(n)时间内求无序数组中与中位数最近的k个数
- 无序数组找中位数
- 【算法题】星际穿越
- SpringMVC 手动控制事务提交
- hadoop2.x的简要说明,新特性yarn的加入
- nginx-fpm设置
- 统一接口调用
- 无序数组中求中位数
- Python多线程
- JavaScript字符串indexOf方法浅析
- LeetCode
- 2016年校招编程笔试题汇总 考点:冒泡排序(稳定排序)、不考虑大小写特殊情况、判断字符串是否包含另一个字符串、判断某个字符串中含有某个字符串的个数
- 支持向量机详解
- 康托展开和逆康托展开
- html5移动开发屏幕宽度相关概念
- TensorFlow深度学习框架