中位数附近的2k+1个数

问题 B: 中位数附近2k+1个数

时间限制: 2 Sec 内存限制: 32 MB

提交: 70 解决: 11

提交 状态 算法问答

题目描述

给出一串整型数 a1,a2,…,an 以及一个较小的常数 k,找出这串数的中位数 m 和最接近 m 的小于等于 m 的 k 个数,以及最接近 m 的大于等于 m 的 k 个数。将这 2k+1 个数按升序排序后输出。

中位数定义:如果数串的大小是偶数 2j,中位数是从小到大排列的第 j 个数;如果数串的大小是奇数 2j+1,中位数是从小到大排列的第 j+1 个数。

输入

第一行是 k 的值和数串的长度 n。

第二行是以空格隔开的 n 个整型数,最后一个数后面有空格。

输出

按升序排列的 2k+1 个数,以空格分开,最后一个数后面没有空格。结果可能出现重复的数。

样例输入

2 10

7 2 5 7 2 10 7 7 13 15

样例输出

5 7 7 7 7

提示

使用时间复杂度是O(n)的算法


思路:

  • 采用优化过的快速选择选出中位数,并将数组切分为左、中位数、右,其中左<中位数<右.

  • 将左、右子数组堆化为两个堆(一个最大堆+一个最小堆)

  • 从堆中删除元素以便于输出那最后的k个数(两组)其中注意到从最大堆删除元素的时候需要逆序输出

算法时间复杂度
优化过的快速选择O(n)
堆化O(n)
从堆中取出(删除)元素O(klogn)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值