IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 1743. 从相邻元素对还原数组 -> 正文阅读

[数据结构与算法]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 。如果存在多种解答,返回 其中任意一个 即可。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/restore-the-array-from-adjacent-pairs

思路

首先观察一下,我们会发现,如果把数组看着链表的话,给出来的是链表的链。
如果一个数组的长度是n的话,就有n-1个连接关系,
而且对于数组两头的数字,只有一对连接关系,其他的都是两对。
比如[1,2,3,4],长度是4,连接关系只有3对,[1,2] 、 [2,3] 、[3,4]
而且对于两头的数字1 和 4 来说,各种只有一对 [1,2] 和 [3,4] 。
但是对于中间的数字2 和 3 来说,就都有两对,2 就有[1,2] 和 [2,3] 、3 就有 [2,3] 和[3,4]
所以,只要从任意一个地方开始,根据题目给出的连接关系向两边扩展,就简单粗暴的解决了。

小技巧

  1. 多申请一倍的空间来避免数组越界
  2. 使用hash表来加速查找的速度

代码

class Solution {
public:
    vector<int> restoreArray(vector<vector<int>>& adjacentPairs) {
        int halfSize = adjacentPairs.size();
        vector<int> ans(halfSize * 2 + 2, 0);
        map<int, vector<int>> pairsAdjacent; 
        // 存储每个数字的邻居,最多两个,最少一个
        for (int i = 0; i < halfSize; i++) {
            int a = adjacentPairs[i][0], b = adjacentPairs[i][1];
            pairsAdjacent[a].push_back(b);
            pairsAdjacent[b].push_back(a);
        }
        int j = halfSize + 1, i = j - 1;
        // 从中间开始扩展
        ans[i] = adjacentPairs[0][0], ans[j] = adjacentPairs[0][1]; 
        while (j - i + 1 < halfSize + 1) {
            vector<int> pair = pairsAdjacent[ans[i]];
            // 只有两头的元素才只有一个邻居
            if (pair.size() == 1) {
                ans[i-1] = pair[0];
            } else {
                ans[i-1] = pair[0] == ans[i + 1] ? pair[1] : pair[0];
                i--;
            }
            pair = pairsAdjacent[ans[j]];
            if (pair.size() == 1) {
                ans[j+1] = pair[0];
            } else {
                ans[j+1] = pair[0] == ans[j - 1] ? pair[1] : pair[0];
                j++;
            }
        }
        return vector<int>(ans.begin() + i, ans.begin() + j + 1); 
    }
}

时间复杂度:O(n)O(n)
空间复杂度:O(n)O(n)

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-26 12:18:24  更:2021-07-26 12:19:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 17:51:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码