寻找数组中第K大的元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寻找数组中第K大的元素相关的知识,希望对你有一定的参考价值。

参考技术A

tag: Medium

这题最简单的做法是将数组排序,然后直接返回第K大的元素。复杂度为:O(NlogN)。但是,很明显,出题者并不想让我们这么做。

如果对数组排序,算法的复杂度起码是 O(NlogN)。那么如果我们不排序,能不能求出第K大元素呢?答案是可以的,我们知道快速排序中有一个步骤是 partition。它选择一个元素作为枢纽(pivot),将所有小于枢纽的元素放到枢纽的左边,将所有大于枢纽的元素放到枢纽的右边。然后返回枢纽在数组中的位置。那么,关键就在这里了。如果此时返回的枢纽元素在数组中的位置刚好是我们所要求的位置,问题就能得到解决了。

我们先选取一个枢纽元素,从数组的第一个元素开始到最后一个元素结束。将大于枢纽的左边元素和小于枢纽的右边元素交换。然后判断当前枢纽元素的 index 是否为 n - k,如果是则直接返回这个枢纽元素。如果 index 大于 n - k,则我们从枢纽的左边继续递归寻找,如果 index 小于 n - k,则我们从枢纽的右边继续递归寻找。

复杂度为:O(N) + O(N / 2) + O(N / 4) + ...
最终算法复杂度为 O(N)

以上是关于寻找数组中第K大的元素的主要内容,如果未能解决你的问题,请参考以下文章

寻找数组中第K大的数

寻找数组中的第K大的元素,多种解法以及分析

快速排序算法及其思想的应用(寻找一个序列中第k小元素)

LeetCode 668. 乘法表中第k小的数 / 462. 最少移动次数使数组元素相等 II / 436. 寻找右区间

找数组中第K大的数 请教

查找无序数组中第K大的数