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

LeetCode 138: Copy List with Random Pointer

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

基本資料
#

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

  • 提交紀錄:Wrong Answer → Time Limit Exceeded → Accepted ×2

解題思路
#

random 可能指到後面還沒建立的節點,所以分兩次走(Linked List「其他」):

  1. 第一次:每個舊節點建一個新節點,存進字典 old -> new。
  2. 第二次:新節點的 next 是 d[old.next]、random 是 d[old.random]。

字典裡先放 None: None,指標是 None 時就不用特判。

我的嘗試
#

第一版把範例的答案寫死了,當然 WA。第二版用了字典的做法,但第二個迴圈忘了 cur = cur.next,TLE;加上就 AC 了。

正確解法
#

class Solution:
    def copyRandomList(self, head: 'Optional[Node]') -> 'Optional[Node]':
        d = {None: None}
        cur = head
        while cur:
            d[cur] = Node(cur.val)
            cur = cur.next
        cur = head
        while cur:
            d[cur].next = d[cur.next]
            d[cur].random = d[cur.random]
            cur = cur.next
        return d[head]

複雜度
#

時間 O(n),空間 O(n)。也可以把新節點插在每個舊節點後面,做到 O(1) 額外空間。

要特別避免的錯誤
#

  • 第二個迴圈也要讓 cur 前進。
  • 字典的 key 是節點本身,不是值(值可能重複)。

面試口說整理
#

random 可能指向還沒建立的節點,所以我先走一次建立舊節點到新節點的對應,再走一次接上 next 和 random。字典先放 None 對 None,就不用特判。時間和空間都是 O(n)。

相關文章

LeetCode 105: Construct Binary Tree from Preorder and Inorder Traversal
·1 分鐘
LeetCode Medium Array Hash-Table Divide-and-Conquer Tree
LeetCode 105 解題筆記:前序的第一個是根,在中序裡找到根的位置就知道左子樹有幾個節點;用字典查位置,O(n)
LeetCode 143: Reorder List
·1 分鐘
LeetCode Medium Linked-List Two-Pointers Stack Recursion
LeetCode 143 解題筆記:找中點、反轉後半段、兩條交錯合併;前半段的尾巴要切斷
LeetCode 208: Implement Trie (Prefix Tree)
·1 分鐘
LeetCode Medium Hash-Table String Design Trie
LeetCode 208 解題筆記:每個節點是 children 字典加一個 is_end 標記;insert、search、startsWith 都是沿著字元往下走
LeetCode 424: Longest Repeating Character Replacement
·1 分鐘
LeetCode Medium Hash-Table String Sliding-Window
LeetCode 424 解題筆記:可變長度滑動視窗,視窗長度減掉最多的字元次數就是要替換的數量,超過 k 就縮左邊
LeetCode 981: Time Based Key-Value Store
·2 分鐘
LeetCode Medium Hash-Table String Binary-Search Design
LeetCode 981 解題筆記:每個 key 存一個 (timestamp, value) 的 list,timestamp 是遞增的;get 時二分找最後一個 timestamp <= 查詢時間的
LeetCode 128: Longest Consecutive Sequence
·1 分鐘
LeetCode Medium Array Hash-Table Union-Find
LeetCode 128 解題筆記:放進 set,只從「x - 1 不在 set 裡」的數開始往上數,每個數最多被看兩次,O(n)