Leetcode: Clone Graph

题目

Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors.

 

思路

1. 这题明说, label 独一无二, 那么就可以使用 hash map 存储元素

2. BFS 搜索, 边搜边向 hash map 添加元素

3. 在设置标记位上 TLE 了 N 次, 一个元素一旦被假如到 hash map, 就说明该元素已经被访问到了并已被假如到 queue 中, 同时环的问题也被克服了. 我在做的时候, 把环的问题拉出来单独处理, 但标记忘记了

4. unordered_map<node*, node*> 这种设置不是第一次见到了, 比设置成 unordered_map<int, node*> 要方便一些

5. map.count 比 map.find 要精练一些

6. 加入 map 时, 可以直接 map[] = xxx, 不用判断是否已有

 

代码

class Solution {

public:

    UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {

		unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> record;

		if(node == NULL)

			return node;



		deque<UndirectedGraphNode*> queue;

		queue.push_back(node);



		while(!queue.empty()) {

			UndirectedGraphNode *nextNode = queue.front();

			queue.pop_front();



			if(!record.count(nextNode)) {

				UndirectedGraphNode *newNode = new UndirectedGraphNode(nextNode->label);

				record[nextNode] = newNode;

			}

			for(int i = nextNode->neighbors.size()-1; i >= 0 ; i --) {

				UndirectedGraphNode *childNode = nextNode->neighbors[i];

				if(!record.count(childNode)) {

					UndirectedGraphNode *newNode = new UndirectedGraphNode(childNode->label);

					record[childNode] = newNode;

					queue.push_back(childNode);

				}

				record[nextNode]->neighbors.push_back(record[childNode]);

			}

		}

		return record[node];

	}

};

  

你可能感兴趣的:(LeetCode)