O(n)时间内求无序数组中与中位数最近的k个数
2012-03-16 10:38
363 查看
昨天同学问到,于是立即帮忙想了一个方法。
问题是,给定一个无序的数组,找出与中位数最接近的k个数,要求O(n)的复杂度。
思路是这样的:
首先,我们需要知道利用线性时间选择可以在O(n)的时间内求出无序数组的中位数。
(1)O(n)求出无序数组中位数
(2)把数组里的所有数依次减去中位数并取绝对值,得到一个新的数组。这个数组的每个数表示其与中位数的距离的大小。复杂度O(n)。
(3)利用线性时间选择的方法,可以在O(n)时间求出第k个数,此时其左边的所有数都比k小,即可得到k个最小的数。
(4)k个最小的数所对应的原数就是与中位数最近的k个数。
至此完成要求。
问题是,给定一个无序的数组,找出与中位数最接近的k个数,要求O(n)的复杂度。
思路是这样的:
首先,我们需要知道利用线性时间选择可以在O(n)的时间内求出无序数组的中位数。
(1)O(n)求出无序数组中位数
(2)把数组里的所有数依次减去中位数并取绝对值,得到一个新的数组。这个数组的每个数表示其与中位数的距离的大小。复杂度O(n)。
(3)利用线性时间选择的方法,可以在O(n)时间求出第k个数,此时其左边的所有数都比k小,即可得到k个最小的数。
(4)k个最小的数所对应的原数就是与中位数最近的k个数。
至此完成要求。
相关文章推荐
- 两个无序数组分别叫A和B,长度分别是m和n,求中位数,要求时间复杂度O(m+n),空间复杂度O(1) 。
- 无序数组A和B,线性时间复杂度,空间复杂度O(1) ,求中位数
- 两个无序数组分别叫A和B,长度分别是m和n,求中位数,要求时间复杂度O(m+n),空间复杂度O(1) 。
- 用线性时间选择来找无序数组的中位数
- 求无序数组的中位数(转载)
- 用O(lgn)时间求出两个已排序数组的中位数
- 现有1,2……一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度为O(1),使用交换,而且只能交换两个数
- 给定无序数组A,在线性时间内找到i和j,j>i,并且保证A[j]-A[i]是最大的。
- 78 无序数组的中位数
- 求无序数组的中位数
- 求一个无序数组的中位数
- day21桶排序一个无序数组+求一个无序数组中的中位数
- LeetCode Median of Two Sorted Arrays 在两个已排列的数组中找出中位数。时间复杂度为O(log(min(N,M))
- 在一个时间字符串数组中找出离当前时间字符串最近的前后两个时间
- 现有1,2……一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度为O(1),使用交换,而且只能交换两个数
- O(n)时间内查找到无序数组当中的第二大元素
- 对有限数组进行计数排序和求一个无序数组的中位数——题集(十八)
- 对数组排序时间复杂度要求O(n)与找中位数不能用排序
- 【模式匹配】— 求比数组所有比自身元素小且在它之前离它最近的元素位置,时间复杂度O(n).
- 无序数组O(n)时间找到排序后的两个相邻元素使得他们之间的差最大