zoukankan      html  css  js  c++  java
  • [LeetCode 1743.] 从相邻元素对还原数组

    LeetCode 1743. 从相邻元素对还原数组

    题目描述

    存在一个由 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] 只表示两个元素相邻,并不保证其 左-右 顺序。

    示例 2:

    输入:adjacentPairs = [[4,-2],[1,4],[-3,1]]
    输出:[-2,4,1,-3]
    解释:数组中可能存在负数。
    另一种解答是 [-3,1,4,-2] ,也会被视作正确答案。

    示例 3:

    输入:adjacentPairs = [[100000,-100000]]
    输出:[100000,-100000]

    提示:

    • nums.length == n
    • adjacentPairs.length == n - 1
    • adjacentPairs[i].length == 2
    • 2 <= n <= 105
    • -105 <= nums[i], ui, vi <= 105
    • 题目数据保证存在一些以 adjacentPairs 作为元素对的数组 nums

    解题思路

    直观上看,题目给了一个图,两个端点是一度点,其余顶点是二度点,找到一个端点,然后沿着路径一路找出所有顶点即可。
    这里有两个问题要考虑清楚:

    1. 如何找到端点?
    2. 如何区分两个邻居点,哪一个是还没有用过的点?

    第一个问题,通过观察可以发现,两个端点在原本的 adjacentPairs 中只出现一次,其余点出现两次。
    第二个问题,可以考虑图的存储方式,如何快速定位到邻居顶点,并再次找出其邻居顶点?这里我们用 hashMap 来完成这一工作,然后每次加入一个顶点就把它从 map 中删除,以此来判断顶点是否用过。

    参考代码

    class Solution {
    public:
        vector<int> restoreArray(vector<vector<int>>& adjacentPairs) {
            size_t n = adjacentPairs.size() + 1;
            unordered_map<int, vector<int> > g; // {adjs}
            for (auto&& v : adjacentPairs) {
                g[v[0]].push_back(v[1]);
                g[v[1]].push_back(v[0]);
            }
            int start = INT32_MIN;
            for (auto&& [k, v] : g) {
                if (v.size() == 1) {
                    start = k;
                    break;
                }
            }
            assert(start > INT32_MIN);
            vector<int> res;
            res.reserve(n);
            int nextx = start;
            while (!g.empty()) {
                int x = nextx;
                res.push_back(x);
                for (int y : g[x]) {
                    if (g.count(y)) {
                        nextx = y;
                        break;
                    }
                }
                g.erase(x);
            }
            return res;
        }
    };
    
  • 相关阅读:
    C++中的向量学习
    delphi中判断popupmenu的弹出来源....
    在QT4中使用类似QVBox类似功能
    flex控件的学习网站(收藏)
    总结Flash XMLSocket 通信问题
    Fiddle扩展HttpPing批量检测web服务器是否正常
    flex的Socket通讯沙箱和安全策略问题
    .Net平台开源作业调度框架Quartz.Net
    IE6 7 select option设置disabled无效
    Flex值得一看参考资源
  • 原文地址:https://www.cnblogs.com/zhcpku/p/15057750.html
Copyright © 2011-2022 走看看