LeetCode - 数组中的第K个最大元素

【Medium】获取第 K 大的数

参考:Leetcode - 数组中的第K个最大元素open in new window

参考答案:

方法一:先排序,后获取,比如快排

  • 时间复杂度 O(nlogn)
  • 空间复杂度 O(logn)

方法二:基于堆排序的选择算法,风动之石的博客 - 堆open in new window

function TopK(array, maxIndex) {
    const heap = new Heap();
    array.forEach(item => {
        heap.push(item);
        if (heap.size > maxIndex) {
            heap.pop();
        }
    });
    return heap.pop();
}
1
2
3
4
5
6
7
8
9
10
  • 时间复杂度:O(nlogk),其中,每次调整堆的时间复杂度为O(logk)
  • 空间复杂度:O(k)

方法三:快排的变种,适用确定数量的情况下寻找第 K 大的数,因为已确定 K,可将快排里针对两边递归优化为只针对一边进行递归

  • 时间复杂度:最坏情况 O(n^2),平均情况为O(n)
  • 空间复杂度:O(logn)