【LeetCode5665】从相邻元素对还原数组(STL&DFS)

举报
野猪佩奇996 发表于 2022/01/23 02:21:04 2022/01/23
【摘要】 文章目录 1.题目2.思路3.代码4.不用dfs版本 1.题目 https://leetcode-cn.com/problems/restore-the-array-from-adjace...

1.题目

https://leetcode-cn.com/problems/restore-the-array-from-adjacent-pairs/
在这里插入图片描述
在这里插入图片描述

2.思路

(1)不可以像以前(如pat1013)用vector数组存储邻接表(否则会报出下面的错误)——因为数组的元素可能是负数!!!
并木有vector<int,vector<int>>,所以使用map<int,vector<int>>adj存储邻接表,所以后面dfs用到的vis访问数组也是map<int,bool>类型而非vector<bool>vis
用undered_map显然比map更快。

Line 78: Char 17: runtime error: load of null pointer of type 'std::_Bit_type' (aka 'unsigned long') (stl_bvector.h)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_bvector.h:87:17

  
 
  • 1
  • 2

(2)过程:
找到第一个起点(有2个,任意找一个都可以)——根据邻接表的每个点的边表的结点个数为1个即为所求的第一个起点,一开始写的判断条件中size没写==1,而size大于等于1时候也是等于true。

然后dfs遍历一遍二叉树,代码如下,但是这样做的时间复杂度确实高,毕竟这题中这样构造出来的二叉树是个“一条链”,所以还可以优化即不用写dfs。
在这里插入图片描述

3.代码

class Solution {
public:
    //vector<bool>vis;
    unordered_map<int,bool>vis;
    vector<int>ans;
    //vector<int>adj[100010];//存储图的邻接表
    unordered_map<int,vector<int>>adj;
    
    void dfs(int u, unordered_map<int,vector<int> >&vec){
        if(vis[u]==false){
            ans.push_back(u);
            vis[u]=true;
        }
        for(int i=0;i<adj[u].size();i++){
            int v=adj[u][i];
            if(vis[v]==false){
                dfs(v,adj);
            }
        }
    }
    vector<int> restoreArray(vector<vector<int>>& adjacentPairs) {
        //vector<vector<int>>vec=adjacentPairs;
        vector<vector<int>>vec=adjacentPairs;
        int group=vec.size();
        for(int i=0;i<group;i++){
            int a=vec[i][0];
            int b=vec[i][1];
            adj[a].push_back(b);
            adj[b].push_back(a); //无向图
        }
        //找第一个点
        int first;
        for(auto it=adj.begin();it!=adj.end();it++){
            if(it->second.size()==1){
                first=it->first;
                break;
            }
        }
        dfs(first,adj);
        return ans;
    }
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

4.不用dfs版本

贴一个大佬sheeeeeeep-t的代码:

class Solution {
public:
    vector<int> restoreArray(vector<vector<int>>& adjacentPairs) {
        vector<int>ans;
        set<int>st;//set判某个数是否已经加入了答案数组
        unordered_map<int, vector<int>> mp;//哈希表
        int n = adjacentPairs.size();
        for(int i = 0; i < n; i++){
            mp[adjacentPairs[i][0]].push_back(adjacentPairs[i][1]);
            mp[adjacentPairs[i][1]].push_back(adjacentPairs[i][0]);
        }
        int start;
        //找一个端点
        unordered_map<int, vector<int>>::iterator it = mp.begin();
        for(; it != mp.end(); it++){
            if(it->second.size() == 1){
                start = it->first;
                st.insert(start);
                ans.push_back(start);
                break;
            }
        }
        
        //从端点开始构建整个 答案数组
        int temp = start;
        while(st.size() < n + 1){
            for(int i = 0; i < mp[temp].size(); i++){
                if(st.find(mp[temp][i]) == st.end()){
                    temp = mp[temp][i];
                    ans.push_back(temp);
                    st.insert(temp);
                    break;
                }
            }
        }
        return ans;
    }
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。

原文链接:andyguo.blog.csdn.net/article/details/113487475

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。