昨天同学问到,于是立即帮忙想了一个方法。
问题是,给定一个无序的数组,找出与中位数最接近的k个数,要求O(n)的复杂度。
思路是这样的:
首先,我们需要知道利用线性时间选择可以在O(n)的时间内求出无序数组的中位数。
(1)O(n)求出无序数组中位数
(2)把数组里的所有数依次减去中位数并取绝对值,得到一个新的数组。这个数组的每个数表示其与中位数的距离的大小。复杂度O(n)。
(3)利用线性时间选择的方法,可以在O(n)时间求出第k个数,此时其左边的所有数都比k小,即可得到k个最小的数。
(4)k个最小的数所对应的原数就是与中位数最近的k个数。
至此完成要求。