zoukankan      html  css  js  c++  java
  • [LeetCode] 133. 克隆图

    题目链接 : https://leetcode-cn.com/problems/clone-graph/

    题目描述:

    给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆)。图中的每个节点都包含它的值 valInt) 和其邻居的列表(list[Node])。

    示例:

    输入:
    {"$id":"1","neighbors":[{"$id":"2","neighbors":[{"$ref":"1"},{"$id":"3","neighbors":[{"$ref":"2"},{"$id":"4","neighbors":[{"$ref":"3"},{"$ref":"1"}],"val":4}],"val":3}],"val":2},{"$ref":"4"}],"val":1}
    
    解释:
    节点 1 的值是 1,它有两个邻居:节点 2 和 4 。
    节点 2 的值是 2,它有两个邻居:节点 1 和 3 。
    节点 3 的值是 3,它有两个邻居:节点 2 和 4 。
    节点 4 的值是 4,它有两个邻居:节点 1 和 3 。
    

    提示:

    • 节点数介于 1 到 100 之间。
    • 无向图是一个简单图,这意味着图中没有重复的边,也没有自环。
    • 由于图是无向的,如果节点 p 是节点 q 的邻居,那么节点 q 也必须是节点 p 的邻居。
    • 必须将给定节点的拷贝作为对克隆图的引用返回。

    思路:

    这道题就是遍历整个图,所以遍历时候要记录已经访问点, 我们用一个字典记录

    所以,遍历方法就有两种

    思路一:DFS(深度遍历)

    思路二:BFS(广度遍历)

    代码:

    思路一:

    class Solution:
        def cloneGraph(self, node: 'Node') -> 'Node':
            lookup = {}
    
            def dfs(node):
                #print(node.val)
                if not node: return
                if node in lookup:
                    return lookup[node]
                clone = Node(node.val, [])
                lookup[node] = clone
                for n in node.neighbors:
                    clone.neighbors.append(dfs(n))
                
                return clone
    
            return dfs(node)
    

    java

    class Solution {
        public Node cloneGraph(Node node) {
            Map<Node, Node> lookup = new HashMap<>();
            return dfs(node, lookup);
        }
    
        private Node dfs(Node node, Map<Node,Node> lookup) {
            if (node == null) return null;
            if (lookup.containsKey(node)) return lookup.get(node);
            Node clone = new Node(node.val, new ArrayList<>());
            lookup.put(node, clone);
            for (Node n : node.neighbors)clone.neighbors.add(dfs(n,lookup));
            return clone;
        }
    }
    

    思路二:

    """
    # Definition for a Node.
    class Node:
        def __init__(self, val, neighbors):
            self.val = val
            self.neighbors = neighbors
    """
    class Solution:
        def cloneGraph(self, node: 'Node') -> 'Node':
            from collections import deque
            lookup = {}
    
            def bfs(node):
                if not node: return
                clone = Node(node.val, [])
                lookup[node] = clone
                queue = deque()
                queue.appendleft(node)
                while queue:
                    tmp = queue.pop()
                    for n in tmp.neighbors:
                        if n not in lookup:
                            lookup[n] = Node(n.val, [])
                            queue.appendleft(n)
                        lookup[tmp].neighbors.append(lookup[n])
                return clone
    
            return bfs(node)
    

    java

    class Solution {
        public Node cloneGraph(Node node) {
            if (node == null) return null;
            Map<Node, Node> lookup = new HashMap<>();
            Node clone = new Node(node.val, new ArrayList<>());
            lookup.put(node, clone);
            Deque<Node> queue = new LinkedList<>();
            queue.offer(node);
            while (!queue.isEmpty()) {
                Node tmp = queue.poll();
                for (Node n : tmp.neighbors) {
                    if (!lookup.containsKey(n)) {
                        lookup.put(n, new Node(n.val, new ArrayList<>()));
                        queue.offer(n);
                    }
                    lookup.get(tmp).neighbors.add(lookup.get(n));
                }
            }
            return clone;
        }
    }
    

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/clone-graph
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 相关阅读:
    LeetCode Missing Number (简单题)
    LeetCode Valid Anagram (简单题)
    LeetCode Single Number III (xor)
    LeetCode Best Time to Buy and Sell Stock II (简单题)
    LeetCode Move Zeroes (简单题)
    LeetCode Add Digits (规律题)
    DependencyProperty深入浅出
    SQL Server存储机制二
    WPF自定义RoutedEvent事件示例代码
    ViewModel命令ICommand对象定义
  • 原文地址:https://www.cnblogs.com/powercai/p/11202984.html
Copyright © 2011-2022 走看看