LeetCode133——克隆圖
我的LeetCode程式碼倉:https://github.com/617076674/LeetCode
原題連結:https://leetcode-cn.com/problems/clone-graph/description/
題目描述:
知識點:深度優先遍歷、廣度優先遍歷
思路一:深度優先遍歷
用一個雜湊表hashMap來記錄已經克隆了的節點,深度優先遍歷的遞迴函式實現如下:
(1)如果node節點本身為null,直接返回null。
(2)如果hashMap中已經存在了node.label對應的節點,直接返回該節點即可。
(3)如果hashMap中還沒有存在node.label對應的節點,新建一個節點,其label值為node.label,其neighbors的填充,需要遍歷node.neighbors中的每一個節點,遞迴地呼叫該函式來填充。最後,返回cloned。
時間複雜度與每個節點所連線的節點個數有關。空間複雜度為O(n),其中n為節點個數。
JAVA程式碼:
public class Solution { private HashMap<Integer, UndirectedGraphNode> hashMap = new HashMap<>(); //記錄已克隆的節點 public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) { if(null == node){ return null; } UndirectedGraphNode cloned = hashMap.get(node.label); if(null != cloned){ return cloned; } cloned = new UndirectedGraphNode(node.label); hashMap.put(cloned.label, cloned); for(UndirectedGraphNode neighbor : node.neighbors){ cloned.neighbors.add(cloneGraph(neighbor)); } return cloned; } }
LeetCode解題報告:
思路二:廣度優先遍歷
和思路一一樣,用一個hashMap記錄已克隆的節點,利用佇列實現廣度優先遍歷。
出隊入隊操作的是原圖中的節點,對於出隊入隊的迴圈過程,應該如下:
(1)彈出隊首元素now,而得到的克隆節點應該是從hashMap中根據now.label得到的節點。
(2)遍歷now的所有鄰接點,如果hashMap中還不存在鍵為neighbor.label的節點,則將該節點入隊,且在hashMap中新建label為neighbor.label的節點。不管怎樣,都需要將hashMap中鍵為neighbor.label的節點放進cloned的neighbors中。
最後返回的是root節點,即從hashMap中取得的鍵為node.label的節點。
時間複雜度與每個節點所連線的節點個數有關。空間複雜度為O(n),其中n為節點個數。
JAVA程式碼:
public class Solution {
private HashMap<Integer, UndirectedGraphNode> hashMap = new HashMap<>(); //記錄已克隆的節點
public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
if(null == node){
return null;
}
Queue<UndirectedGraphNode> queue = new LinkedList<>();
queue.add(node);
hashMap.put(node.label, new UndirectedGraphNode(node.label));
UndirectedGraphNode root = hashMap.get(node.label);
while(!queue.isEmpty()){
UndirectedGraphNode now = queue.poll();
UndirectedGraphNode cloned = hashMap.get(now.label);
for(UndirectedGraphNode neighbor : now.neighbors){
if(!hashMap.containsKey(neighbor.label)){
queue.add(neighbor);
hashMap.put(neighbor.label, new UndirectedGraphNode(neighbor.label));
}
cloned.neighbors.add(hashMap.get(neighbor.label));
}
}
return root;
}
}
LeetCode解題報告: