1743. 从相邻元素对还原数组 力扣(中等) 需要思考但可以做,hash
题目描述:
存在一个由 n
个不同元素组成的整数数组 nums
,但你已经记不清具体内容。好在你还记得 nums
中的每一对相邻元素。
给你一个二维整数数组 adjacentPairs
,大小为 n - 1
,其中每个 adjacentPairs[i] = [ui, vi]
表示元素 ui
和 vi
在 nums
中相邻。
题目数据保证所有由元素 nums[i]
和 nums[i+1]
组成的相邻元素对都存在于 adjacentPairs
中,存在形式可能是 [nums[i], nums[i+1]]
,也可能是 [nums[i+1], nums[i]]
。这些相邻元素对可以 按任意顺序 出现。
返回 原始数组 nums
。如果存在多种解答,返回 其中任意一个 即可。
示例 1:
输入:adjacentPairs = [[2,1],[3,4],[3,2]] 输出:[1,2,3,4] 解释:数组的所有相邻元素对都在 adjacentPairs 中。 特别要注意的是,adjacentPairs[i] 只表示两个元素相邻,并不保证其 左-右 顺序。
题源:https://leetcode-cn.com/problems/restore-the-array-from-adjacent-pairs/
代码:
class Solution { public: vector<int> restoreArray(vector<vector<int>>& adjacentPairs) { map<int,vector<int>> mp; for(auto i:adjacentPairs) { mp[i[0]].push_back(i[1]); mp[i[1]].push_back(i[0]); } int s; for(auto i: mp) // 找只有一个相邻元素的元素,即 数组头或尾 if (i.second.size()==1) { s=i.first; break; } vector<int> res; res.push_back(s); for(int l=0;l<adjacentPairs.size();l++) { if ( mp[res[l]].size()>=2) //如果,有两个相邻,res中已有一个,排除,剩下那个即后面的元素 { if (mp[res[l]][0]==res[l-1]) res.push_back(mp[res[l]][1]); else res.push_back(mp[res[l]][0]); } else //如果是头,或者尾,只有一个元素,直接加入就可以了 res.push_back(mp[res[l]][0]); } return res; } };