Description

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

Example:

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

Intuition#

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

  • 數字以字串表示,可能超過 Long 範圍,需要自訂比較器
  • 字串數字比較:先比長度,長度相同再按字典序
  • Top-K 問題的標準 Min Heap 解法

Approaches#

1: Sorting#

  • 概念: 用自訂比較器排序,直接取第 k 大
  • 時間複雜度: O(n log n * L) - L 為字串平均長度
  • 空間複雜度: 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#

  • 概念: 用大小為 k 的 Min Heap,自訂字串數字比較器,堆頂即為第 k 大
  • 時間複雜度: O(n log k * L) - L 為字串平均長度
  • 空間複雜度: 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#

  • Pattern: Top-K 問題 → 大小為 k 的 Min Heap,堆頂為答案
  • 關鍵技巧: 大數字串比較先比長度再比字典序;此題是 215. Kth Largest Element 的字串版本