最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)LeetCode(133.克隆無向圖)

 更新時間:2021年07月28日 14:29:13   作者:Grandyang  
這篇文章主要介紹了C++實現(xiàn)LeetCode(133.克隆無向圖),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 133. Clone Graph 克隆無向圖

Given a reference of a node in a connected undirected graph, return a deep copy (clone) of the graph. Each node in the graph contains a val (int) and a list (List[Node]) of its neighbors.

Example:

Input:
{"$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}

Explanation:
Node 1's value is 1, and it has two neighbors: Node 2 and 4.
Node 2's value is 2, and it has two neighbors: Node 1 and 3.
Node 3's value is 3, and it has two neighbors: Node 2 and 4.
Node 4's value is 4, and it has two neighbors: Node 1 and 3.

Note:

  1. The number of nodes will be between 1 and 100.
  2. The undirected graph is a simple graph, which means no repeated edges and no self-loops in the graph.
  3. Since the graph is undirected, if node p has node q as neighbor, then node q must have node p as neighbor too.
  4. You must return the copy of the given node as a reference to the cloned graph.

這道無向圖的復(fù)制問題和之前的 Copy List with Random Pointer 有些類似,那道題的難點是如何處理每個結(jié)點的隨機(jī)指針,這道題目的難點在于如何處理每個結(jié)點的 neighbors,由于在深度拷貝每一個結(jié)點后,還要將其所有 neighbors 放到一個 vector 中,而如何避免重復(fù)拷貝呢?這道題好就好在所有結(jié)點值不同,所以我們可以使用 HashMap 來對應(yīng)原圖中的結(jié)點和新生成的克隆圖中的結(jié)點。對于圖的遍歷的兩大基本方法是深度優(yōu)先搜索 DFS 和廣度優(yōu)先搜索 BFS,這里我們先使用深度優(yōu)先搜索DFS來解答此題,在遞歸函數(shù)中,首先判空,然后再看當(dāng)前的結(jié)點是否已經(jīng)被克隆過了,若在 HashMap 中存在,則直接返回其映射結(jié)點。否則就克隆當(dāng)前結(jié)點,并在 HashMap 中建立映射,然后遍歷當(dāng)前結(jié)點的所有 neihbor 結(jié)點,調(diào)用遞歸函數(shù)并且加到克隆結(jié)點的 neighbors 數(shù)組中即可,代碼如下:

解法一:

class Solution {
public:
    Node* cloneGraph(Node* node) {
        unordered_map<Node*, Node*> m;
        return helper(node, m);
    }
    Node* helper(Node* node, unordered_map<Node*, Node*>& m) {
        if (!node) return NULL;
        if (m.count(node)) return m[node];
        Node *clone = new Node(node->val);
        m[node] = clone;
        for (Node *neighbor : node->neighbors) {
            clone->neighbors.push_back(helper(neighbor, m));
        }
        return clone;
    }
};

我們也可以使用 BFS 來遍歷圖,使用隊列 queue 進(jìn)行輔助,還是需要一個 HashMap 來建立原圖結(jié)點和克隆結(jié)點之間的映射。先克隆當(dāng)前結(jié)點,然后建立映射,并加入 queue 中,進(jìn)行 while 循環(huán)。在循環(huán)中,取出隊首結(jié)點,遍歷其所有 neighbor 結(jié)點,若不在 HashMap 中,我們根據(jù) neigbor 結(jié)點值克隆一個新 neighbor 結(jié)點,建立映射,并且排入 queue 中。然后將 neighbor 結(jié)點在 HashMap 中的映射結(jié)點加入到克隆結(jié)點的 neighbors 數(shù)組中即可,參見代碼如下:

解法二:

class Solution {
public:
    Node* cloneGraph(Node* node) {
        if (!node) return NULL;
        unordered_map<Node*, Node*> m;
        queue<Node*> q{{node}};
        Node *clone = new Node(node->val);
        m[node] = clone;
        while (!q.empty()) {
            Node *t = q.front(); q.pop();
            for (Node *neighbor : t->neighbors) {
                if (!m.count(neighbor)) {
                    m[neighbor] = new Node(neighbor->val);
                    q.push(neighbor);
                }
                m[t]->neighbors.push_back(m[neighbor]);
            }
        }
        return clone;
    }
};

類似題目:

Copy List with Random Pointer

參考資料:

https://leetcode.com/problems/clone-graph/

https://leetcode.com/problems/clone-graph/discuss/42313/C%2B%2B-BFSDFS

https://leetcode.com/problems/clone-graph/discuss/42309/Depth-First-Simple-Java-Solution

到此這篇關(guān)于C++實現(xiàn)LeetCode(133.克隆無向圖)的文章就介紹到這了,更多相關(guān)C++實現(xiàn)克隆無向圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ 中placement new 操作符使用方法

    C++ 中placement new 操作符使用方法

    這篇文章主要介紹了C++ 中placement new 操作符使用方法的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • VS2019配置BOOST的方法(v1.70.0庫)

    VS2019配置BOOST的方法(v1.70.0庫)

    這篇文章主要介紹了VS2019配置BOOST的方法(v1.70.0庫),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • C++11中移動構(gòu)造函數(shù)案例代碼

    C++11中移動構(gòu)造函數(shù)案例代碼

    C++11 標(biāo)準(zhǔn)中為了滿足用戶使用左值初始化同類對象時也通過移動構(gòu)造函數(shù)完成的需求,新引入了 std::move() 函數(shù),它可以將左值強(qiáng)制轉(zhuǎn)換成對應(yīng)的右值,由此便可以使用移動構(gòu)造函數(shù),對C++11移動構(gòu)造函數(shù)相關(guān)知識感興趣的朋友一起看看吧
    2023-01-01
  • c++截取漢字和英文混合字符串代碼實例

    c++截取漢字和英文混合字符串代碼實例

    這篇文章主要介紹了c++截取漢字英文混合字符串,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • C語言中#pragma預(yù)處理指令的使用

    C語言中#pragma預(yù)處理指令的使用

    在所有的預(yù)處理指令中,#pragma指令可能是最復(fù)雜的了,它的作用是設(shè)定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動作,本文主要介紹了C語言中#pragma預(yù)處理指令的使用,感興趣的可以了解一下
    2023-12-12
  • 老生常談C語言靜態(tài)函數(shù)庫的制作和使用

    老生常談C語言靜態(tài)函數(shù)庫的制作和使用

    下面小編就為大家?guī)硪黄仙U凜語言靜態(tài)函數(shù)庫的制作和使用。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • C語言實現(xiàn)按行讀寫文件

    C語言實現(xiàn)按行讀寫文件

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)按行讀寫文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C++實現(xiàn)二叉樹非遞歸遍歷算法詳解

    C++實現(xiàn)二叉樹非遞歸遍歷算法詳解

    在C++中,二叉樹非遞歸遍歷是一種常用的算法,可避免遞歸過程中的系統(tǒng)開銷和棧溢出問題。非遞歸遍歷算法利用棧數(shù)據(jù)結(jié)構(gòu)實現(xiàn),可以實現(xiàn)前序、中序和后序遍歷,是C++程序員必備技能之一
    2023-04-04
  • C++實現(xiàn)簡單射擊小游戲

    C++實現(xiàn)簡單射擊小游戲

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)簡單射擊小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • C語言中文件處理全攻略詳解

    C語言中文件處理全攻略詳解

    這篇文章主要為大家詳細(xì)介紹了C語言中文件處理的相關(guān)知識,包括創(chuàng)建、寫入、追加操作解析,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2024-01-01

最新評論

靖边县| 武强县| 崇明县| 娱乐| 呼伦贝尔市| 中山市| 柳州市| 屏东县| 廉江市| 长泰县| 滨海县| 甘肃省| 宁波市| 会理县| 西乌珠穆沁旗| 邻水| 岫岩| 容城县| 齐齐哈尔市| 玛纳斯县| 苏尼特右旗| 太和县| 巩义市| 兰州市| 保亭| 土默特右旗| 江西省| 沭阳县| 兴安盟| 清涧县| 无棣县| 谷城县| 康定县| 石楼县| 宁南县| 东城区| 泊头市| 邛崃市| 卓资县| 株洲县| 连州市|