1. 程式人生 > >LeetCode133——克隆圖

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解題報告: