1743. 从相邻元素对还原数组2021-07-25

╰半橙微兮° 2022-08-31 13:24 223阅读 0赞

存在一个由 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/restore-the-array-from-adjacent-pairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  1. 对于一维数组Nums中的元素nums[i],若其为数组的第一个或最后一个元素,
  2. 则该元素有且仅有一个元素与其相邻;若其为数组的中间元素,则该元素有且仅有两个元素与其相邻。
  3. 我们可以对每个元素记录与它相邻的元素有哪些,然后依次检查每个元素的相邻元素数量,即可找到原数组的第一个元素和最后一个元素。
  4. 由于我们可以返回任意一个满足条件的数组,故指定这两个元素中的一个为原数组的第一个元素,然后根据相邻元素信息确定数组的第二个、第三个元素………………直到
  5. 确定最后一个元素为止。
  6. 具体地,我们使用哈希表记录每一个元素的相邻元素有哪些,然后我们遍历哈希表,找到有且仅有一个相邻元素的元素e1作为原数组的第一个元素,那么与e1唯一相邻的元素
  7. 即为原数组的第二个元素。此时排除掉与e2相邻的e1后,可以确认与e2相邻的e3即为原数组的第三个元素………………y以此类推,我们可以将原数组完整推断出来;
  8. """
  9. from collections import defaultdict
  10. class Solution:
  11. def restoreArray(self,adjacentPairs):
  12. n = len(adjacentPairs)+1
  13. adjvex = defaultdict(list)
  14. for x,y in adjacentPairs:
  15. adjvex[x].append(y)
  16. adjvex[y].append(x)
  17. start =-1
  18. for x ,ys in adjvex.items():
  19. # 起点和终点,必然只有一个后继
  20. if len(ys) ==1:
  21. start =x
  22. break
  23. res=[start,adjvex[start][0]]
  24. for _ in range(2,n):
  25. x=res[-1]
  26. for y in adjvex[x]:
  27. if y!=res[-2]:
  28. res.append(y)
  29. break
  30. return res
  31. s=Solution()
  32. t=s.restoreArray([[2,1],[3,4],[3,2]])
  33. print(t)
  34. """
  35. 思路和心得:
  36. 1.题目给的条件比较友好
  37. n个不同元素组成的数组
  38. 2.起点和终点,必然都只有一个邻居
  39. 中间的点,有左和右两个邻居
  40. 3.邻接表
  41. 4.先找起点(起点和终点都行。都可作为起点。无正反)

发表评论

表情:
评论列表 (有 0 条评论,223人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++程序设计:相邻

    【问题描述】 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1。 【输入形式】 输入的第一行包含一个整数n,表示给定整数的个数。 第二行包含所给定的n个

    相关 CCF 相邻

    一、试题 问题描述   给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1。 输入格式   输入的第一行包含一个整数n,表示给定整数的个数。