215. 數組中第k個最大的元素
在未排序的數組中找到第 k 個最大的元素。請注意,你需要找的是數組排序後的第 k 個最大的元素,而不是第 k 個不同的元素。
示例 1:
輸入: [3,2,1,5,6,4] 和 k = 2
輸出: 5
示例 2:
輸入: [3,2,3,1,2,4,5,5,6] 和 k = 4
輸出: 4
class Solution {
public int findKthLargest(int[] nums, int k) {
//第一種方法,利用sort函數
//時間複雜度Olog(N),空間O(1)
Arrays.sort(nums);
return nums[nums.length-k];
}
}
堆排序
碰到這種第k大,第k小的問題的常用解法就是堆排序。
二叉堆:就是一棵按照特定的序列排序的二叉樹,在二叉堆中如果父節點的值永遠大於子節點的值,成爲大頂堆(即堆頂元素是最大的),而堆頂元素是最小的,則爲小頂堆
上圖爲小頂堆。
使用最大堆(或最小堆)查找最小(或最大)的k個數,比較適合處理海量數據。因爲內存的限制,通常不能一次全部載入所有輸入數據到內存中。因此,可以每次只讀取一部分數據,使用堆來維持目前已知的狀態。
大頂堆和小頂堆可以用優先隊列這樣的數據結構來實現。
PriorityQueue:默認是最小堆 ,需要設置過之後,才能成爲最大堆。
小頂堆每次都把堆頂(即最小的元素)推出去,維護一串數字中較大的數;
大頂堆每次都把堆頂(即最大的元素)推出去,維護一串數字中較小的數;
//找數組中第k個最大的元素
class solution{
public int findKLargest(int[] nums, int k){
priorityQueue<Integer> queue = new PriorityQueue<> ();
//遍歷數組,添加元素
for(int num : nums){
queue.offer(num);
if(queue.size()>k){
queue.poll();//把棧頂最小的元素推出去
}
return queue.peek();
}
實現大頂堆,需要設置比較器爲逆序
PriorityQueue queue = new PriorityQueue<>(Comparator.reverseOrder());
關於Compartor,可以參考此篇博客:
https://blog.csdn.net/qq_35029061/article/details/86655957