題目
思路:
- 可以找到最小可重複動作嗎?
- 題目的 method 要傳入 first node, 回傳它的 clone
- 最小可重複動作可設定為:給定一個 node, 回傳 its clone
- DFS: 先寫 recursive case
- Base case: method 收到已 clone 過的 node
- Use a dict to record nodes been cloned.
- 須注意傳入 cloneGraph 的 node 有可能是 None
1 | """ |
How to do it with BFS?
思路
- 一開始的直覺想法是就照 DFS 的套路,只是改成 recursive case 在迴圈裡做,也就是說把要執行最小可重複動作的 node 放入 stack 讓他在之後的迴圈去做 recursive case
- 上面的 recursive case: clone 自己,也 clone 自己的所有 neighbors 並加到我的 clone 的 neighbors
- 發現問題:那些 neighbors 繼續丟進 stack 想重複一樣的動作時,發現會 clone 兩次,表示這個動作拆的不好
- 修改最小可重複動作:我先 clone 好自己,最小可重複動作改成 clone 我的 neighbors 並加入我 clone 的 neighbors,這樣就不會 clone 兩次了,所有加入 stack 的 node 都是已經 clone 過的
- clone 前先檢查 base case:假如這個 neighbor 有在
old_to_new裡,代表他已經有被 clone 過了,而且也有被加入過 stack,所以不用再 clone & add to stack,但還是要把他的 clone add to neighbors,因為一個點可能同時是好幾個點的鄰居,所以當然有可能被加好幾次鄰居
1 | def cloneGraph(self, node: Optional['Node']) -> Optional['Node']: |