LeetCode 克隆圖
克隆一張無向圖,圖中的每個節點包含一個 label (標籤)和一個 neighbors (鄰接點)列表 。
OJ的無向圖序列化:
節點被唯一標記。
我們用 # 作為每個節點的分隔符,用 , 作為節點標籤和鄰接點的分隔符。
例如,序列化無向圖 {0,1,2#1,2#2,2}。
該圖總共有三個節點, 被兩個分隔符 # 分為三部分。
第一個節點的標籤為 0,存在從節點 0 到節點 1 和節點 2 的兩條邊。
第二個節點的標籤為 1,存在從節點 1 到節點 2 的一條邊。
第三個節點的標籤為 2,存在從節點 2 到節點 2 (本身) 的一條邊,從而形成自環。
我們將圖形視覺化如下:
1
/ \
/ \
0 --- 2
/ \
\_/
思路分析:首先採取廣度優先遍歷,將所有的圖中所有的節點進行訪問,並且得到所有的節點地址。然後新建節點,並且將原來的節點與這些新建的節點一一對應的關聯,並且複製這些節點的 label (標籤),最後複製這些節點的neighbors (鄰接點)。
/**
* Definition for undirected graph.
* struct UndirectedGraphNode {
* int label;
* vector<UndirectedGraphNode *> neighbors;
* UndirectedGraphNode(int x) : label(x) {};
* };
*/
class Solution {
public:
vector<UndirectedGraphNode*> undifGNVec;//圖的節點遍歷序列
map< UndirectedGraphNode*, UndirectedGraphNode*> hashMap;
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if (node == NULL) {
return NULL;
}
undifGNVec.push_back(node);//起始節點,放入遍歷序列
UndirectedGraphNode *nodePtr;
queue<UndirectedGraphNode*> myQueue;//廣度優先遍歷的輔助佇列
myQueue.push(node);
//利用輔助佇列,廣度優先遍歷圖
while (!myQueue.empty()) {
int tempSize = myQueue.size();//上一次佇列的大小
//將上一次佇列清空,並且放入新的未位訪問的節點
for (int i = 0; i < tempSize; ++i) {
nodePtr = myQueue.front();
myQueue.pop();
for (auto vecIt : nodePtr->neighbors) {
//如果這個點沒有訪問過
if (find(undifGNVec.begin(), undifGNVec.end(), vecIt) == undifGNVec.end()) {
undifGNVec.push_back(vecIt);//放到遍歷序列
myQueue.push(vecIt);//放到隊尾
}
}
}
}
//將undifGNVec中的所有節點label複製,並且有map容器將它們進行關聯
for (auto it : undifGNVec) {
nodePtr = new UndirectedGraphNode(it->label);
hashMap[it] = nodePtr;
}
//將undifGNVec中的所有節點neighbors複製
for (auto it : undifGNVec) {
for (auto vecIt : it->neighbors) {
hashMap[it]->neighbors.push_back(hashMap[vecIt]);
}
}
nodePtr = hashMap[node];
return nodePtr;
}
};
遞迴演算法實現
/**
* Definition for undirected graph.
* struct UndirectedGraphNode {
* int label;
* vector<UndirectedGraphNode *> neighbors;
* UndirectedGraphNode(int x) : label(x) {};
* };
*/
class Solution {
public:
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if (!node) return NULL;
//複製節點label (標籤
UndirectedGraphNode *rtn = new UndirectedGraphNode(node->label);
//進行map標記
my_map.insert(make_pair(node, rtn));
//訪問它的neighbors (鄰接點)
for (int i = 0; i < (node->neighbors).size(); i++) {
//如果已經訪問過
if (my_map.find(node->neighbors[i]) != my_map.end()) {
rtn->neighbors.push_back(my_map[node->neighbors[i]]);
} else {
UndirectedGraphNode *data = cloneGraph(node->neighbors[i]);
rtn->neighbors.push_back(data);
}
}
return rtn;
}
private:
map<UndirectedGraphNode *, UndirectedGraphNode *> my_map;
};
相關文章
- LeetCode-133-克隆圖LeetCode
- js中深克隆與淺克隆JS
- 淺克隆和深克隆的用法
- 淺克隆深克隆舉例解讀
- vue陣列的深克隆和淺克隆Vue陣列
- JAVA 基礎 – clone淺克隆與深克隆Java
- 深入理解Java的淺克隆與深克隆Java
- JS型別判斷、物件克隆、陣列克隆JS型別物件陣列
- javascript深度克隆JavaScript
- js 深度克隆JS
- 克隆專案
- Rust克隆陷阱?Rust
- 原生js實現物件的深克隆以及淺克隆JS物件
- java深克隆(深拷貝)和淺克隆(淺拷貝)Java
- js深度克隆物件JS物件
- 物件如何深度克隆物件
- 淺談克隆 JavaScriptJavaScript
- windows賬號克隆Windows
- JavaScript cloneNode() 克隆節點JavaScript
- Javascript 繼承和克隆JavaScript繼承
- js物件的深度克隆!JS物件
- Java中的物件“克隆”Java物件
- js克隆一個物件JS物件
- 2.10 克隆資料庫資料庫
- github克隆專案太慢Github
- js deep clone 深克隆JS
- 沒看這篇文章之前,我以為真的懂深克隆和淺克隆。
- 圖解leetcode5-10 | 和233醬一起刷leetcode系列(2)圖解LeetCode
- JS物件深度克隆/複製JS物件
- 虛擬機器的克隆虛擬機
- Oracle 建立PDB-本地克隆Oracle
- vue 對資料的克隆Vue
- js之物件深淺克隆JS物件
- PDB克隆遷移轉換
- 簡單介紹克隆 JavaScriptJavaScript
- 在 JavaScript 中如何克隆物件?JavaScript物件
- js 淺拷貝(淺複製、淺克隆)、深拷貝(深複製、深克隆)JS
- 什麼要使用克隆、如何實現克隆物件、序列化與反序列實現克隆的好處、深拷貝與淺拷貝物件