【LeetCode5665】从相邻元素对还原数组(STL&DFS)
【摘要】
文章目录
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)