力扣(LeetCode)133

題目地址:
https://leetcode-cn.com/probl...
題目描述:
給定無向連通圖中一個節點的引用,返回該圖的深拷貝(克隆)。圖中的每個節點都包含它的值 val(Int) 和其鄰居的列表(list[Node])。

提示:
節點數介於 1 到 100 之間。
無向圖是一個簡單圖,這意味着圖中沒有重複的邊,也沒有自環。
由於圖是無向的,如果節點 p 是節點 q 的鄰居,那麼節點 q 也必須是節點 p 的鄰居。
必須將給定節點的拷貝作爲對克隆圖的引用返回。

解答:

首先解釋一下,深拷貝的意思是,一個節點,若對它進行深拷貝,那麼必然生成一個新的節點,這個節點的所有的屬性值和原節點相同,但是這兩個節點在內存中是兩個不同的對象,這樣稱之爲深拷貝。

這一題的做法是,使用一個hashmap來記錄,原node 和 新node的對應關係。

若原node已經作爲key存在於hashmap裏,那麼說明它的拷貝(新node)也

已經存在,那麼直接獲得它的拷貝,否則,就要爲這個node生成新的拷貝

然後,把拷貝放入hashmap中,並且使得拷貝(新node)的鄰接鏈表添加原node的鄰接鏈表裏元素的拷貝

話比較繞,看代碼就懂了!!!

java ac代碼:

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> neighbors;

    public Node() {}

    public Node(int _val,List<Node> _neighbors) {
        val = _val;
        neighbors = _neighbors;
    }
};
*/
class Solution {
    HashMap<Node,Node>map = new HashMap();
    public Node cloneGraph(Node node) {
 
        if(node == null)return null;
        if(map.containsKey(node))
            return map.get(node);
        Node newnode = new Node(node.val,null);
        map.put(node,newnode);
        if(node.neighbors != null){
            newnode.neighbors = new ArrayList();
            for(Node nn:node.neighbors)
                newnode.neighbors.add(cloneGraph(nn));
        }
       return newnode;
        
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章