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

LeetCode 3493: Properties Graph

·1 分鐘· ·
LeetCode Medium Graph Dfs Union-Find Hash-Map
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2025-03-23

  • 提交紀錄:Accepted(一次通過)

解題思路
#

兩列 i、j 之間有邊,條件是它們的相異數字交集至少 k 個。建好圖之後數連通塊。

n, m <= 100,兩兩比較是 O(n^2) 對,每對算交集 O(m),總共 10^6 等級,夠快。

我的解法
#

class Solution:
    def numberOfComponents(self, properties: List[List[int]], k: int) -> int:
        n = len(properties)
        sets = [set(p) for p in properties]       # 先轉一次 set,不要每次比較都重轉

        parent = list(range(n))

        def find(x: int) -> int:
            while parent[x] != x:
                parent[x] = parent[parent[x]]
                x = parent[x]
            return x

        components = n
        for i in range(n):
            for j in range(i + 1, n):
                if len(sets[i] & sets[j]) >= k:
                    ri, rj = find(i), find(j)
                    if ri != rj:
                        parent[ri] = rj
                        components -= 1
        return components

原本的版本建鄰接表再用遞迴 DFS 數連通塊,結果一樣。有兩個地方可以改:

  • intersect(a, b) 每次比較都重新 set(a)、set(b),同一列會被轉換 n 次。先轉一次存起來就好。
  • graph[i] = graph.get(i, []) + [j] 每次都建一個新 list,鄰接表越長越慢;用 append 就好。

這裡直接改用 Union-Find,邊算邊合併,不用建鄰接表。

複雜度
#

時間 O(n^2 · m),空間 O(n · m)。

要特別避免的錯誤
#

  • 交集用原本的 list 算:要先去重,題目算的是相異數字。
  • 每次比較都重新建 set。
  • 用 list + [x] 累加鄰接表。

面試口說整理
#

我先把每列轉成 set,兩兩比較交集大小,至少 k 就把兩列用 Union-Find 合併,每次真的合併兩塊就把連通塊數減 1。n 和 m 都只有 100,兩兩比較的 O(n^2 m) 足夠快。

相關文章

LeetCode 133: Clone Graph
·1 分鐘
LeetCode Medium Hash-Table Depth-First-Search Breadth-First-Search Graph
LeetCode 133 解題筆記:DFS 時用雜湊表記住舊節點對應的新節點,遇到已經複製過的就直接回傳,避免無限遞迴;空圖回傳 None
LeetCode 695: Max Area of Island
·1 分鐘
LeetCode Medium Array Depth-First-Search Breadth-First-Search Union-Find
LeetCode 695 解題筆記:每遇到一個沒走過的 1 就 DFS 整座島,數格子數,取最大值;格子是整數 1,不是字串
LeetCode 128: Longest Consecutive Sequence
·1 分鐘
LeetCode Medium Array Hash-Table Union-Find
LeetCode 128 解題筆記:放進 set,只從「x - 1 不在 set 裡」的數開始往上數,每個數最多被看兩次,O(n)
LeetCode 3494: Find the Minimum Amount of Time to Brew Potions
·1 分鐘
LeetCode Medium Simulation Prefix-Sum Array
LeetCode 3494 解題筆記:每瓶藥先往前推出最後一位巫師的完成時間(每個人都要等自己有空),再往回扣出每位巫師的完成時間
LeetCode 2487: Remove Nodes From Linked List
·1 分鐘
LeetCode Medium Linked-List Stack Recursion Monotonic-Stack
LeetCode 2487 解題筆記:保留的節點從左到右是非遞增的;用單調棧,比新節點小的都彈掉,最後把棧裡的節點串起來
LeetCode 988: Smallest String Starting From Leaf
·1 分鐘
LeetCode Medium String Backtracking Tree Depth-First-Search
LeetCode 988 解題筆記:DFS 時把字元加在字串前面,到葉子時就是「從葉子到根」的字串,取最小的