🕵🏼

347. Top K Frequent Elements

2022/11/01に公開

題目

思路

使用兩個 dictionary 來追蹤出現次數

  • 第一個: key 為數字, value 為 count
  • 第二個: key 為 count, value 為存有數字的 set

另外紀錄目前技術的最大值,在第二段處理時遞減取用第二的 dictionary

處理分成兩段:

記錄次數

走訪所有的元素。走訪的過程更新記數的 dictionary ,並更新

組合 result array

從 max 開始取用第二個 array ,直到滿足 k 個數字為止。

程式碼

class Solution {
    func topKFrequent(_ nums: [Int], _ k: Int) -> [Int] {
        guard !nums.isEmpty else { return [] }

        var most = 0
        var map = [Int: Int]()
        var reverse = [Int: Set<Int>]()
        
        for num in nums {
            var count = map[num] ?? 0
            reverse[count]?.remove(num)
            count += 1
            map[num] = count
            reverse[count, default: Set<Int>()].insert(num)
            most = max(most, count)
        }
        
        var remaining = k
        var result = [Int]()
        var current = most
        
        while remaining > 0 && current >= 0 {
            if let set = reverse[current] {
                remaining -= set.count
                result.append(contentsOf: Array(set))
                current -= 1
            }
        }
        
        return result
    }
}

後記

直覺自己在資料操作上雖然可以快速取得最大次數的數字,但是過程覺得有點複雜

雖然照著第一想法寫出來有辦法 AC

接著來看看官方解法,看有什麼比較好的寫法

Discussion