快轉到主要內容
leetcode 215 - Kth Largest Element in an Array

leetcode 215 - Kth Largest Element in an Array

·
類別 
Leetcode
標籤 
Java Leetcode Medium Heap Problem
Eason Chiu
作者
Eason Chiu
一個不做筆記就容易忘記的工程師
目錄

題目
#

leetcode 215 - Kth Largest Element in an Array (題目說明請點連結)

題目簡述
#

給定一個整數陣列 nums 和一個整數 k,找到陣列中第 k 大的元素。

範例
#

Example 1:

Input: nums = [3,2,1,5,6,4], k = 2
Output: 5
Explanation: 數組中第 2 大的元素是 5。

Example 2:

Input: nums = [3,2,3,1,2,4,5,5,6], k = 4
Output: 4
Explanation: 數組中第 4 大的元素是 4。

解題思路
#

題目要求找到數組中第 k 大的元素。可以使用多種方法來解決此問題,常見的解法有以下兩種:

  1. 排序法:將數組排序,然後選擇第 k 大的元素。
  2. 堆法:使用最小堆(Min-Heap)來解決,堆中始終保持 k 個最大元素,最小堆的根元素即為第 k 大的元素。

在這裡,我們選擇使用 最小堆,因為這樣可以達到更高效的時間複雜度。具體步驟如下:

解法
#

  1. 初始化一個最小堆(Min-Heap)。
  2. 遍歷數組中的每個元素:
    • 如果堆的大小小於 k,將當前元素加入堆中。
    • 如果堆的大小達到 k,並且當前元素大於堆頂元素(最小值),則將堆頂元素移除並將當前元素加入堆中。
  3. 當所有元素遍歷完成後,堆頂元素即為第 k 大的元素。

這樣我們就能在 O(n log k) 的時間複雜度內找到第 k 大的元素。

完整程式碼
#

java
import java.util.PriorityQueue;

class Solution {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> heap = new PriorityQueue<>();

        // 遍歷數組中的每個元素
        for (int num : nums) {
            // 如果堆的大小小於 k,直接插入元素
            if (heap.size() < k || heap.peek() <= num) {
                heap.offer(num);
            }

            // 如果堆的大小超過 k,移除堆頂最小元素
            if (heap.size() > k) {
                heap.poll();
            }
        }

        // 返回堆頂元素,即為第 k 大的元素
        return heap.peek();
    }
}

時間複雜度
#

  • 時間複雜度:O(n log k),其中 n 是數組的長度,k 是第 k 大的 k
  • 空間複雜度:O(k),用於存儲最小堆

相關文章

leetcode 199 - Binary Tree Right Side View
類別 
Leetcode
標籤 
Java Leetcode Medium BFS Problem DFS Problem
leetcode 503 - Next Greater Element II
類別 
Leetcode
標籤 
Java Leetcode Medium Stack Problem
leetcode 57 - Insert Interval
類別 
Leetcode
標籤 
Java Leetcode Medium Array Problem Blind75