Medium草稿★★★★★O(n log k * L) 時間 · O(k) 空間
HeapPriority QueueStringSorting
Patterns⛰️ 堆・Top-K🔢 排序後處理
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

1985Find the Kth Largest Integer in the ArrayHeap / Priority QueueMediumHeap / Priority Queue

給定一個字串陣列 nums,其中每個字串代表一個不含前導零的整數。回傳第 k 大的整數(字串形式)。注意:重複的數字要分開計算。

Example:

Input: nums = [“3”,“6”,“7”,“10”], k = 4 Output: “3”

Intuition

TIP

核心思路:用自訂比較器的 Min Heap(大小為 k)處理大數字串比較,堆頂即為第 k 大。

Approaches

1. Sorting — O(n log n * L) / O(n)
  • Idea: 用自訂比較器排序,直接取第 k 大
  • Time: O(n log n * L) - L 為字串平均長度
  • Space: O(n)
class Solution {
    fun kthLargestNumber(nums: Array<String>, k: Int): String {
        nums.sortWith(Comparator { a, b ->
            if (a.length != b.length) a.length - b.length
            else a.compareTo(b)
        })
        return nums[nums.size - k]
    }
}
⭐ 2. Min Heap — O(n log k * L) / O(k)
  • Idea: 用大小為 k 的 Min Heap,自訂字串數字比較器,堆頂即為第 k 大
  • Time: O(n log k * L) - L 為字串平均長度
  • Space: O(k)
class Solution {
    fun kthLargestNumber(nums: Array<String>, k: Int): String {
        val minHeap = PriorityQueue<String>(Comparator { a, b ->
            if (a.length != b.length) a.length - b.length
            else a.compareTo(b)
        })

        for (num in nums) {
            minHeap.offer(num)
            if (minHeap.size > k) {
                minHeap.poll()
            }
        }

        return minHeap.peek()
    }
}

🔑 Takeaways