Medium
这题很明显,并非那么简单. 逻辑很直白的,多半是想考你最优解法,时间空间复杂度最低。
我用的最intuitive的解法,建立一个从大到小的priorityQueue, 把所有数组元素丢进去,然后一个一个取取到第k个.
O(N lg K) running time + O(K) memory
为什么这里时间复杂度是O(NlgK)而不是O(N)呢,因为priorityQueue本质上是Binary heap, which is quite like a complete binary tree. 它的insert()和delete()都是O(lgK),而我们遍历了array里的N个元素来进行insert or delete, 所以是O(Nlg
class Solution {
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> pq = new PriorityQueue<>(nums.length, new Comparator<Integer>(){
public int compare(Integer a, Integer b){
return b - a;
}
});
for (Integer i : nums){
pq.offer(i);
}
int topK = 0;
while (k > 0){
topK = pq.poll();
k--;
}
return topK;
}
}
然而这肯定不是面试官想要的解法,为了这个写这个QuickSelect解法我花了感觉大半天时间吧。