1 | 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数, |
1 | class Solution { |
快速选择算法(类似于快速排序)
快速选择算法借鉴了快速排序的思想,在一轮快速排序中,基准元素$(pivot)$的左侧有 $p$ 个元素,右侧有 $q$ 个元素,我们需要找第 $k$ 小的元素。如果 $k = p + 1$,那么基准元素即为第 $k$ 小的元素;如果 $k <= p$,那么第 $k$ 小的元素出现在左侧的 $p$ 个元素中,因此我们并不需要对右侧的元素进行排序;如果 $k > p + 1$,那么第 $k$ 小的元素出现在右侧的 $q$ 个元素中,因此我们并不需要对左侧的元素进行排序。
因此,快速选择算法相当于每次只对一侧的元素进行排序,而舍弃了另一侧的元素。这样我们就可以在平均 $O(N)$ 的时间复杂度找到数组中第 $k$ 小的元素。在本题中,我们只需要知道中位数对应的 $k$,再使用快速选择算法找到底 $k$ 小的元素即可。
1 | public class Solution { |