leetcode每日一道(16)复制一个无向图,每个节点都包含一个标签和它的邻居列表

news/2024/7/24 6:30:50 标签: leetcode, 无向图复制, 深度优先, 广度优先

题目描述

本题要求复制一个无向图,图中每个节点都包含一个标签和它的邻居列表
我们无向图用以下的方法序列化:
节点的标签是互不相同的,
我们使用“#”作为节点之间的分隔符,使用“,”作为节点标签和节点的节点邻居的分隔符。
例如:现在有一个序列化的无向图{0,1,2#1,2#2,2}.
这个无向图一共有3个节点,因此序列被#分隔成三部分
第一个节点的标签是0,节点0和节点1,节点2之间有边
第二个节点的标签是1,节点1和节点2之间有边
第三个节点的标签是2,节点2和节点2(它自己)之间有边,形成了自环

我们看到了这个题之后,有什么想法呢,这个无向图,和链表,和二叉树有什么区别呢,其实没有本质的区别,无非是另外一种结构罢了。那么我们如何复制呢,本题的解法就涉及到两个知识点

  1. 无向图如何能遍历完全?深度优先遍历DFS,把图的节点先复制下来。
  2. 用map保存旧节点和新节点的映射关系。
    一些细节呢,比如DFS通过递归实现,map用的是unordered_map<>实现,unordered_map中的元素,first是key,second是value。

下面就是代码,整体来说没有多少难度

/**
 * Definition for undirected graph.
 * struct UndirectedGraphNode {
 *     int label;
 *     vector<UndirectedGraphNode *> neighbors;
 *     UndirectedGraphNode(int x) : label(x) {};
 * };
 */
class Solution {
public:
    unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> mp;
    void dfs(UndirectedGraphNode* node){
        if(node==nullptr) return;
        if(mp.count(node)) return;
        auto cpyNode = new UndirectedGraphNode(node->label);
        mp[node] = cpyNode;
        for (auto subnode:node->neighbors){
            dfs(subnode);
        }
    }
    UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
        auto oldNode = node;
        dfs(node);
        for (auto item:mp){
            auto first = item.first;
            for(int i=0;i < first->neighbors.size();i++){
                item.second->neighbors.push_back(mp[first->neighbors[i]]);
            }
        }
        return mp[oldNode];
    }
};

http://www.niftyadmin.cn/n/880060.html

相关文章

Google搜索的10个小技巧,部分适用于百度

微信搜索【前端全栈开发者】关注这个脱发、摆摊、卖货、持续学习的程序员&#xff0c;第一时间阅读最新文章&#xff0c;会优先两天发表新文章。关注即可大礼包&#xff0c;准能为你节省不少钱&#xff01; 这些出色的提示和技巧可像专业人士一样使用Google。 我们通常会在需要…

leetcode每日一道(17)思路惊为天人!切分为回文子串所需的最少切分次数

文章目录题目描述思路问题引申&#xff1a;如何找到一个字符串中究竟有多少个回文子串&#xff1f;代码题目描述 给出一个字符串s&#xff0c;分割s使得分割出的每一个子串都是回文串 计算将字符串s分割成回文分割结果的最小切割数 例如:给定字符串s“aab”, 返回1&#xff0c;…

TypeScript和Nodemon终极设置!

微信搜索【前端全栈开发者】关注这个脱发、摆摊、卖货、持续学习的程序员&#xff0c;第一时间阅读最新文章&#xff0c;会优先两天发表新文章。关注即可大礼包&#xff0c;准能为你节省不少钱&#xff01; 学习如何设置TypeScript和Nodemon&#xff0c;以提高你的生产力并轻松…

leetcode每日一道(18)神仙思路!返回字符串所有的回文子串切分结果

题目描述 给定一个字符串s&#xff0c;分割s使得s的每一个子串都是回文串 返回所有的回文分割结果。&#xff08;注意&#xff1a;返回结果的顺序需要和输入字符串中的字母顺序一致。&#xff09; 例如:给定字符串s“aab”, 返回 [“aa”,“b”],↵ [“a”,“a”,“b”] 深度优…

我不能没有的5个Vue.js库

微信搜索【前端全栈开发者】关注这个脱发、摆摊、卖货、持续学习的程序员&#xff0c;第一时间阅读最新文章&#xff0c;会优先两天发表新文章。关注即可大礼包&#xff0c;准能为你节省不少钱&#xff01; 1.Click Off to Close 有的时候&#xff0c;我们需要在用户点击元素之…

leetcode每日一道(19)逆向思维!模拟围棋:请捕获所有的被‘X’包围的区域

题目描述 现在有一个仅包含‘X’和‘O’的二维板&#xff0c;请捕获所有的被‘X’包围的区域 捕获一个被包围区域的方法是将被包围区域中的所有‘O’变成‘X’ 例如 X X X X X O O X X X O X X O X X 执行完你给出的函数以后&#xff0c;这个二维板应该变成&#xff1a; X X X …

Windows Terminal完整指南

在本文中&#xff0c;我们将探讨Windows Terminal&#xff0c;它是WSL2的理想配套。它速度快、可配置、外观漂亮&#xff0c;并且提供了Windows和Linux开发的所有优点。 Windows已经完全接受了Linux&#xff0c;而WSL2使它成为一种无缝的乐趣。 你可以通过以下方式访问发行版…

只用一个CSS属性打造自适应网站

用一个CSS属性创建一个响应式网站&#xff0c;让我们来看看它是如何做到的。&#x1f914; 以这个模板为例&#xff0c;没有应用css属性。&#x1f5a5; 使用 clamp() CSS函数&#xff0c;我们可以创建仅具有一个属性的响应式网站。 现在添加魔术CSS clamp(minimum, preferr…