LeetCode刷題-- 排序

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章