数组中的第K个最大元素「变题」

215. 数组中的第K个最大元素

 

开头先来一个小插曲,关于「快排」相关总结可见 详解快排及其应用关于「详解堆排序」相关总结可见 详解堆排序「优先队列」

这个题可以用两种方法:堆排序 && 快排

方法一:堆排序

看到很多人说不能使用 Java 中的 PriorityQueue,需要自己手动实现,所以这里使用自己实现的小根堆

时间复杂度:O(NlogK);空间复杂度:O(K)

方法二:快排

时间复杂度:O(N);空间复杂度:O(1)

关于时间复杂度的分析,可见 时间复杂度分析

变题一:无序数组找中位数

对于一组有序数据:X1,X2,,Xn

n 为奇数时,中位数:X(n+1)/2;当 n 为偶数时,中位数:Xn/2+Xn/2+12

所以,该问题转化为:当 n 为奇数时,求第 (n+1)/2 大;当 n 为偶数时,求第 n/2n/2+1 大,然后取平均值

变题二:判断一个数是否为第k大 (考虑数组中有重复元素)

假设求第 2 大,此时数组为:[5, 5, 4, 4, 4, 3]

按照上述方法求,那么第 2 大的数为 5,但此时第二大的数应该为 4

这里使用「堆排序」的方法,用一个Set记录已经出现过的数字,如果再次出现,则跳过

具体代码如下: