Leetcode 133. 克隆图

给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆)。图中的每个节点都包含它的值 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. 节点数介于 1 到 100 之间。
  2. 无向图是一个简单图,这意味着图中没有重复的边,也没有自环。
  3. 由于图是无向的,如果节点 p 是节点 q 的邻居,那么节点 q 也必须是节点 p 的邻居。
  4. 必须将给定节点的拷贝作为对克隆图的引用返回。

题目分析

我的解法比较糟糕。首先进行了一遍DFS,构造一个数组,里面包含所有节点,值已经确定,但是neighbors为空。

再对这个数组进行遍历,把点与点之间的连接信息加入数组中。

将目标节点返回。

代码

class Solution {
    public ArrayList<Node> nodes = new ArrayList<Node>();
    public ArrayList<Integer> visited = new ArrayList<Integer>();
    
    public boolean isVisited(int val){
       
        for(Integer i:visited)
        {
            if(i==val){
                return true;
            }
        }
        return false;
    }
    
    public void dfs(Node node){
        for(Node n:node.neighbors)
        {
            if(!visited.contains(node.val)){
                visited.add(node.val);
                nodes.add(node);
            }
            if(!isVisited(n.val))
            {
                dfs(n);
            }
                
        }

    }

    
    public Node getNode(Node[] nodes, int val)
    {
        for(Node n:nodes)
        {
            if(n.val==val){
                return n;
            }
        }
        return null;
    }
    public Node cloneGraph(Node node) {
        visited.add(node.val);
        nodes.add(node);
        dfs(node);
        int totalNum = visited.size();
        Node[] newNodes = new Node[totalNum];

        for(int i=0;i<totalNum;i++)
        {
            ArrayList<Node> neighbors = new  ArrayList<Node>();
            newNodes[i] = new Node(visited.get(i),neighbors);
        }
        
        Node[] nodes_array = new Node[nodes.size()];
        for(int i=0;i<nodes.size();i++)
        {
            nodes_array[i]=nodes.get(i);
        }
        
        for(Node n:newNodes)
        {
            Node originNode = getNode(nodes_array, n.val);
            for(Node x:originNode.neighbors)
            {
                n.neighbors.add(getNode(newNodes, x.val));
            }
        }

        Node result = getNode(newNodes,node.val);
        return result;
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值