↓快轉到主要內容
  1. LeetCode/

LeetCode 347: Top K Frequent Elements

·1 分鐘· ·
LeetCode Medium Array Hash-Table Divide-and-Conquer Sorting
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-10-27

  • 提交紀錄:Runtime Error → Accepted ×2

解題思路
#

先用 Counter 計數。取次數最多的 k 個:

  • 大小為 k 的 min-heap,以次數比較(Heap 模板一),O(n log k)。
  • Bucket sort(Bucket Sort):次數最多是 n,開 n + 1 個桶,bucket[c] 放次數是 c 的數,從大的桶往下收集到 k 個,O(n)。

我的嘗試
#

第一版寫成 Counter(nums).most_common().keys(),most_common() 回傳的是 list(AttributeError)。改成 [x for x, _ in Counter(nums).most_common(k)] 就 AC 了,這是 O(n log n)。

正確解法
#

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        cnt = Counter(nums)
        buckets = [[] for _ in range(len(nums) + 1)]
        for x, c in cnt.items():
            buckets[c].append(x)
        res = []
        for c in range(len(nums), 0, -1):
            res += buckets[c]
            if len(res) >= k:
                return res[:k]
        return res

複雜度
#

時間 O(n),空間 O(n)。

要特別避免的錯誤
#

  • most_common() 回傳的是 list,沒有 .keys()。
  • 題目要求比 O(n log n) 快,直接排序不符合進階要求。

面試口說整理
#

我先計數,次數最多是 n,所以開 n + 1 個桶,把每個數放進它次數的桶,再從次數最大的桶往下收集到 k 個。時間 O(n);也可以用大小為 k 的 heap,O(n log k)。

相關文章

LeetCode 49: Group Anagrams
·1 分鐘
LeetCode Medium Array Hash-Table String Sorting
LeetCode 49 解題筆記:把每個字串排序後當成 key,同一個 key 的字串就是同一組 anagram
LeetCode 169: Majority Element
·1 分鐘
LeetCode Easy Array Hash-Table Divide-and-Conquer Sorting
LeetCode 169 解題筆記:Boyer-Moore 投票,不同的數兩兩抵消,最後留下的就是出現超過一半的那個
LeetCode 128: Longest Consecutive Sequence
·1 分鐘
LeetCode Medium Array Hash-Table Union-Find
LeetCode 128 解題筆記:放進 set,只從「x - 1 不在 set 裡」的數開始往上數,每個數最多被看兩次,O(n)
LeetCode 75: Sort Colors
·1 分鐘
LeetCode Medium Array Two-Pointers Sorting Quicksort
LeetCode 75 解題筆記:荷蘭國旗:low 左邊都是 0、high 右邊都是 2;遇到 2 換到 high 之後不要前進,換過來的數還沒檢查
LeetCode 73: Set Matrix Zeroes
·1 分鐘
LeetCode Medium Array Hash-Table Matrix
LeetCode 73 解題筆記:先記下哪些列、哪些欄有 0,掃完之後再一起改;進階用第一列、第一欄當標記
LeetCode 47: Permutations II
·1 分鐘
LeetCode Medium Array Backtracking Sorting
LeetCode 47 解題筆記:先排序,同一層如果跟前一個值相同而且前一個還沒被用,就跳過