iT邦幫忙

2025 iThome 鐵人賽

0
自我挑戰組

leetcode解題學習java系列 第 29

30天LeetCode挑戰紀錄-DAY29. Clone Graph

  • 分享至 

  • xImage
  •  

題目

https://ithelp.ithome.com.tw/upload/images/20251020/20178158KhEmGLpMFX.png

https://ithelp.ithome.com.tw/upload/images/20251020/20178158x6OLPEVX3Y.png

他會給一個無向連通圖 (undirected graph)的節點 node,每個節點都有一個 val(節點值)和neighbors(鄰居列表)。
接著他要求我回傳整張圖的深拷貝 (deep copy)。
就是要建立一張新的圖,每個節點和邊都要全新複製,但結構完全相同。
那圖中他可能會有環,所以要避免重複建立節點,然後會用DFS搭配一個visited映射表記錄原節點->克隆節點,visited的作用就是用來處理環,避免無限遞迴的,之後每建立一個新節點時,就把它放進visited裡面,下次再遇到同一個原節點時,就直接使用已建立好的克隆節點。
https://ithelp.ithome.com.tw/upload/images/20251020/20178158CjMibtkA9U.png

程式碼

/*
// 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 {
    private Node[] visited = new Node[101]; // 紀錄是否已克隆過 (題目: val ≤ 100)

    public Node cloneGraph(Node node) {
        if (node == null) return null;

        Node copy = new Node(node.val);     // 建立起始節點
        visited[node.val] = copy;           // 登記克隆關係
        dfs(node, copy);                    // DFS 深拷貝所有鄰居
        return copy;
    }

    private void dfs(Node orig, Node clone) {
        for (Node nei : orig.neighbors) {
            if (visited[nei.val] == null) {     // 還沒克隆過
                Node newNode = new Node(nei.val);
                visited[nei.val] = newNode;
                clone.neighbors.add(newNode);
                dfs(nei, newNode);              
            } else {
                clone.neighbors.add(visited[nei.val]); // 已克隆過,直接連接
            }
        }
    }
}

程式碼引用:
https://leetcode.com/problems/clone-graph/solutions/7243746/simple-java-solution


上一篇
30天LeetCode挑戰紀錄-DAY28. Shortest Path in Binary Matrix
下一篇
30天LeetCode挑戰紀錄-DAY30. 我的30天心得!
系列文
leetcode解題學習java30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言