[LeetCode]133. 克隆图(java实现)dfs+哈希表

1. 题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 读题(需要重点注意的东西)

思路(dfs+哈希表):
用哈希表来存储映射关系
① 复制所有点 dfs

复制的点用哈希表进行映射 — key(原来的节点) :value(复制出来的节点)

② 复制所有边

枚举原节点key的所有邻接点找到它们在value中的值,加到res链表中,然后再将这个res链表赋值给复制出来的节点的neighbors即完成了复制节点的边的连接。

3. 解法

---------------------------------------------------解法---------------------------------------------------

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> neighbors;
    public Node() {
        val = 0;
        neighbors = new ArrayList<Node>();
    }
    public Node(int _val) {
        val = _val;
        neighbors = new ArrayList<Node>();
    }
    public Node(int _val, ArrayList<Node> _neighbors) {
        val = _val;
        neighbors = _neighbors;
    }
}
*/

class Solution {
    Map<Node,Node> map = new HashMap<>();
    public Node cloneGraph(Node node) {
        if(node == null) return null;
        dfs(node); // 将所有节点复制到哈希表中

        // 遍历哈希表,复制边
        for(var entry : map.entrySet()){
            // 原节点为a
            Node a = entry.getKey();
            // 复制出来的节点为b
            Node b = entry.getValue();

            // 用res存储b的边
            List<Node> res = new ArrayList<>();
            // 找到a的边
            // 将a的所有邻接点的映射点加到res中
            for(int i = 0;i < a.neighbors.size();i++)
                res.add(map.get(a.neighbors.get(i)));

            // 将res加到b的邻接表中
            b.neighbors = res;
        }
        return map.get(node);
    }

    // 复制所有节点到哈希表中
    public void dfs(Node node){
        map.put(node,new Node(node.val));
        for(int i = 0;i < node.neighbors.size();i++){
            Node p = node.neighbors.get(i);
            if(!map.containsKey(p))
                dfs(p);
        }
    }
}

可能存在的问题:

4. 可能有帮助的前置习题

5. 所用到的数据结构与算法思想

6. 总结

entrySet() 方法可以与 for-each 循环一起使用,用来遍历迭代 HashMap 中每一个映射项

// foreach循环
for(var entry : map.entrySet()){
    // 获得key
    int key = entry.getKey();
	// 获得value
	int value = entry.getValue();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cloudeeeee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值