ARTS是由左耳朵耗子陈皓在极客时间专栏《左耳听风》中发起的一个每周学习打卡计划。
Algorithm:至少做一个 LeetCode 的算法题。主要为了编程训练和学习。Review :阅读并点评至少一篇英文技术文章。主要为了学习英文,如果你英文不行,很难成为技术高手。Tip:学习至少一个技术技巧。主要是为了总结和归纳你日常工作中所遇到的知识点。Share:分享一篇有观点和思考的技术文章。主要为了输出你的影响力,能够输出你的价值观。
Algorithm(算法)
参考文章和视频: https://www.youtube.com/watch?v=_Zt6gwWRnHM https://leetcode-cn.com/problems/clone-graph/solution/dfs-he-bfs-by-powcai/ https://www.youtube.com/watch?v=MOCCC_B3kNg
Leetcode 133 克隆图
这道题就是遍历整个图,所以遍历时候要记录已经访问点, 我们用一个字典记录
所以,遍历方法就有两种
思路一:DFS(深度遍历)
思路二:BFS(广度遍历)
方法一:DFS(深度遍历)
public class Solution {// 定义一个辅助hash表,用于存储原节点和拷贝节点的映射关系private Map<Node, Node> lookup = new HashMap<>();public Node cloneGraph(Node node) {// 如果node节点本身为null,直接返回null。if (node == null) return null;// 如果相邻节点存在于Hash表中,把相应的相邻节点取出,作为当前节点的相邻节点if (lookup.containsKey(node)) return lookup.get(node);// 克隆节点Node clone = new Node(node.val, new ArrayList<>());// 原结点和映射关系存储到hash表lookup.put(node, clone);// 处理相邻节点,dfs(n,lookup)进行深度优先处理,克隆后的Node加到neighborsfor (Node n : node.neighbors) clone.neighbors.add(cloneGraph(n));// 最后返回拷贝节点return clone;}}
方法一:BFS(广度遍历)
public class Solution {/*map 存储原节点和复制节点的关系queue 存储节点*/public Node cloneGraph(Node node) {// 如果node节点本身为null,直接返回null。if (node == null) return null;// 定义HashMap用于查找复制的nodeMap<Node, Node> lookup = new HashMap<>();// 复制的nodeNode 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) {// map里面有从map里取出, 没有就put到map中去if (!lookup.containsKey(n)) {lookup.put(n, new Node(n.val, new ArrayList<>()));// node存入queuequeue.offer(n);}// 给tmp的neighbors添加克隆节点lookup.get(tmp).neighbors.add(lookup.get(n));}}// 返回克隆节点return clone;}}
Review(点评)
- 没有代码结构和代码风格
- 盲目复制粘贴代码
- 晚上熬夜
- 缺乏文档
- 编写代码而不进行测试
Tip(技巧)
Intellij Idea 导入多个maven项目展示在右侧栏Maven Projects
