iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python如何根据相邻关系还原数组
  • 136
分享到

Python如何根据相邻关系还原数组

2023-06-20 18:06:03 136人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

小编给大家分享一下python如何根据相邻关系还原数组,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!题目描述这是 LeetCode 上的 1743. 从相邻元素对

小编给大家分享一下python如何根据相邻关系还原数组,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

题目描述

这是 LeetCode 上的 1743. 从相邻元素对还原数组 ,难度为 中等。

Tag : 「哈希表」、「双指针」、「模拟」

存在一个由 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 <= 10510^5105

  • -10510^5105 <= nums[i], ui, vi <= 10510^5105

  • 题目数据保证存在一些以 adjacentPairs 作为元素对的数组

单向构造(哈希表计数)

根据题意,由于所有的相邻关系都会出现在 numsnumsnums 中,假设其中一个合法数组为 ansansans,长度为 nnn。

那么显然 ans[0]ans[0]ans[0] 和 ans[n−1]ans[n - 1]ans[n−1] 在 numsnumsnums 中只存在一对相邻关系,而其他 ans[i]ans[i]ans[i] 则存在两对相邻关系。

因此我们可以使用「哈希表」对 numsnumsnums 中出现的数值进行计数,找到“出现一次”的数值作为 ansansans 数值的首位,然后根据给定的相邻关系进行「单向构造」,为了方便找到某个数其相邻的数是哪些,我们还需要再开一个「哈希表」记录相邻关系。

Python如何根据相邻关系还原数组

Java 代码:

class Solution {    public int[] restoreArray(int[][] aps) {        int m = aps.length, n = m + 1;        Map<Integer, Integer> cnts = new HashMap<>();        Map<Integer, List<Integer>> map = new HashMap<>();        for (int[] ap : aps) {            int a = ap[0], b = ap[1];            cnts.put(a, cnts.getOrDefault(a, 0) + 1);            cnts.put(b, cnts.getOrDefault(b, 0) + 1);            List<Integer> alist = map.getOrDefault(a, new ArrayList<>());            alist.add(b);            map.put(a, alist);            List<Integer> blist = map.getOrDefault(b, new ArrayList<>());            blist.add(a);            map.put(b, blist);        }        int start = -1;        for (int i : cnts.keySet()) {            if (cnts.get(i) == 1) {                start = i;                break;            }        }        int[] ans = new int[n];        ans[0] = start;        ans[1] = map.get(start).get(0);        for (int i = 2; i < n; i++) {            int x = ans[i - 1];            List<Integer> list = map.get(x);            for (int j : list) {                if (j != ans[i - 2]) ans[i] = j;            }        }        return ans;    }}

Python 3 代码:

class Solution:    def restoreArray(self, adjacentPairs: List[List[int]]) -> List[int]:        m = n = len(adjacentPairs)        n += 1        cnts = defaultdict(int)        hashmap = defaultdict(list)        for a, b in adjacentPairs:            cnts[a] += 1            cnts[b] += 1            hashmap[a].append(b)            hashmap[b].append(a)        start = -1        for i, v in cnts.items():            if v == 1:                start = i                break        ans = [0] * n        ans[0] = start        ans[1] = hashmap[start][0]        for i in range(2, n):            x = ans[i - 1]            for j in hashmap[x]:                if j != ans[i - 2]:                    ans[i] = j        return ans
  • 时间复杂度:O(n)O(n)O(n)

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

双向构造(双指针)

在解法一中,我们通过「哈希表」计数得到 ansansans 首位的原始作为起点,进行「单向构造」。
那么是否存在使用任意数值作为起点进行的双向构造呢?
答案是显然的,我们可以利用 ansansans 的长度为 2<=n<=1052 <= n <= 10^52<=n<=105,构造一个长度 10610^6106 的数组 qqq(这里可以使用 static 进行加速,让多个测试用例共享一个大数组)。

这里 qqq 数组不一定要开成 1e61e61e6 大小,只要我们 qqq 大小大于 ansansans 的两倍,就不会存在越界问题。

从 qqq 数组的 中间位置 开始,先随便将其中一个元素添加到中间位置,使用「双指针」分别往「两边拓展」(l 和 r 分别指向左右待插入的位置)。

当 l 指针和 r 指针直接已经有 nnn 个数值,说明整个 ansansans 构造完成,我们将 [l+1,r−1][l + 1, r - 1][l+1,r−1] 范围内的数值输出作为答案即可。

Python如何根据相邻关系还原数组

Java 代码:

class Solution {    static int N = (int)1e6+10;    static int[] q = new int[N];    public int[] restoreArray(int[][] aps) {        int m = aps.length, n = m + 1;        Map<Integer, List<Integer>> map = new HashMap<>();        for (int[] ap : aps) {            int a = ap[0], b = ap[1];            List<Integer> alist =  map.getOrDefault(a, new ArrayList<>());            alist.add(b);            map.put(a, alist);            List<Integer> blist = map.getOrDefault(b, new ArrayList<>());            blist.add(a);            map.put(b, blist);        }        int l = N / 2, r = l + 1;        int std = aps[0][0];        List<Integer> list = map.get(std);        q[l--] = std;        q[r++] = list.get(0);        if (list.size() > 1) q[l--] = list.get(1);        while ((r - 1) - (l + 1) + 1 < n) {            List<Integer> alist = map.get(q[l + 1]);            int j = l;            for (int i : alist) {                if (i != q[l + 2]) q[j--] = i;            }            l = j;            List<Integer> blist = map.get(q[r - 1]);            j = r;            for (int i : blist) {                if (i != q[r - 2]) q[j++] = i;            }            r = j;        }        int[] ans = new int[n];        for (int i = l + 1, idx = 0; idx < n; i++, idx++) {            ans[idx] = q[i];        }        return ans;    }}

Python 3 代码:

class Solution:    N = 10 ** 6 + 10    q = [0] * N    def restoreArray(self, adjacentPairs: List[List[int]]) -> List[int]:        m = len(adjacentPairs)        n = m + 1        hashmap = defaultdict(list)        for a, b in adjacentPairs:            hashmap[a].append(b)            hashmap[b].append(a)        l = self.N // 2        r = l + 1        std = adjacentPairs[0][0]        lt = hashmap[std]        self.q[l] = std        l -= 1        self.q[r] = lt[0]        r += 1        if len(lt) > 1:            self.q[l] = lt[1]            l -= 1        while (r-1)-(l+1)+1<n:            alt = hashmap[self.q[l+1]]            j = l            for i in alt:                if i != self.q[l+2]:                    self.q[j] = i                    j -= 1            l = j                        blt = hashmap[self.q[r-1]]            j = r            for i in blt:                if i != self.q[r - 2]:                    self.q[j] = i                    j += 1            r = j        ans = [0] * n        for idx in range(n):            ans[idx] = self.q[idx+l+1]        return ans

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

以上是“Python如何根据相邻关系还原数组”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网Python频道!

--结束END--

本文标题: Python如何根据相邻关系还原数组

本文链接: https://www.lsjlt.com/news/298780.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python如何根据相邻关系还原数组
    小编给大家分享一下Python如何根据相邻关系还原数组,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!题目描述这是 LeetCode 上的 1743. 从相邻元素对...
    99+
    2023-06-20
  • MySql如何获取相邻数据
    目录如何获取相邻数据同表相邻数据比对查询需求SQL解析最终SQL如何获取相邻数据 因为项目,所以找到了一些资料并且总结了下关于获取相邻数据的方式。 我只找到了以下的... SEL...
    99+
    2024-04-02
  • python如何实现分组相邻列表
    小编给大家分享一下python如何实现分组相邻列表,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!分组相邻列表在for循环中,对相邻循环进行分组当然很容易,特别是使用zip(),但这肯定不是最好的方法。为了更轻松便捷地实现这...
    99+
    2023-06-27
  • Win7如何关闭系统还原?关闭系统还原方法的教程
      Windows有个系统还原功能,在默认下,是设置在系统C盘,如果系统损坏了,需要还原时,就可以使用此功能。我们在使用Win系统的过程中,有时需要关闭系统还原功能。那Win   方法如下:   1、右击计算机,点属性-...
    99+
    2023-05-21
    Win7关闭系统还原
  • PHP数组分页中如何获取相邻页码?
    在 php 中获取相邻页码:使用 range() 函数生成特定范围内的连续值,范围基于当前页码和相邻页码数。编写自定义函数来处理相邻页码的生成,并返回一个范围。 PHP 数组分页:获取...
    99+
    2024-05-02
    分页 php 标准库
  • gitee如何还原数据
    本篇内容介绍了“gitee如何还原数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!还原单个文件如果你只是需要还原Gitee上的一个文件,可...
    99+
    2023-07-05
  • phpmyadmin如何还原数据库
    小编给大家分享一下phpmyadmin如何还原数据库,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!phpmyadmin如何还原数据库?1、确定备bai份类型 首先需要确定数du据库的备份文件为...
    99+
    2024-04-02
  • postgresql如何还原数据库
    要还原 PostgreSQL 数据库,可以使用 pg_restore 命令。以下是还原数据库的步骤: 打开终端或命令提示符窗口。...
    99+
    2024-04-22
    postgresql
  • plsql如何还原dmp数据库
    要还原dmp数据库,可以使用Oracle提供的imp工具。以下是一些步骤: 打开命令行窗口,输入以下命令连接到数据库: sqlp...
    99+
    2024-04-18
    plsql
  • 阿里云数据库如何还原系统设置
    在使用阿里云数据库的过程中,有时可能会不小心删除了一些重要的系统设置。在这种情况下,如何还原这些系统设置就变得非常重要。本文将详细介绍如何通过阿里云数据库的控制台来还原系统设置。 阿里云数据库是一种高效、安全、易用的云数据库服务,为用户提供...
    99+
    2023-12-15
    阿里 系统设置 数据库
  • 如何在 Golang 中还原数据库?
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-15
  • Oracle数据库备份如何还原
    这篇文章主要介绍了Oracle数据库备份如何还原,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。oracle 数据库提供expdp和impdp命令用于备份和恢复数据库。具体可查...
    99+
    2023-06-21
  • 如何备份和还原MySQL数据
    如何备份和还原MySQL数据,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。使用mysqldump进行备份和还原使用mysqld...
    99+
    2024-04-02
  • oracle数据库删除的数据如何还原
    oracle 中已删除数据可通过以下步骤还原:确认数据存在回收站中。验证您拥有 unrecover table 权限。使用 unrecover table 语句还原数据。可选:使用 sc...
    99+
    2024-04-19
    oracle
  • 如何用Python对数据进行相关性分析
    这期内容当中小编将会给大家带来有关如何用Python对数据进行相关性分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在进行数据分析时,我们所用到的数据往往都不是一维的,而这些数据在分析时难度就增加了不少...
    99+
    2023-06-16
  • mysql如何通过当前排序字段获取相邻数据项
    目录通过当前排序字段获取相邻数据项1.业务场景2.思路3.sql同表相邻数据查询或计算用户下相邻订单的时间差举例通过当前排序字段获取相邻数据项 1.业务场景 (1)需要专门以一个弹窗...
    99+
    2024-04-02
  • python肯德尔系数相关性数据分析示例
    目录前言一、定义二、使用条件三、计算公式及代码示例1.Tau-a2.Tau-b前言 相关性分析算是很多算法以及建模的基础知识之一了,十分经典。关于许多特征关联关系以及相关趋势都可以...
    99+
    2023-02-15
    python肯德尔系数相关性 python 数据分析
  • php如何判断是关联数组还是索引数组
    本篇内容主要讲解“php如何判断是关联数组还是索引数组”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php如何判断是关联数组还是索引数组”吧!判断方法:1、用array_values()将指定数...
    99+
    2023-06-29
  • 云服务器如何关机电脑系统还原
    如果您的云服务器关机了,以下是关机电脑系统还原的步骤: 检查服务器状态:确保您的云服务器处于正确的系统状态,可以运行常规的系统测试程序或命令来检查是否正常关机。 备份数据:如果您有备份数据,可以在关机前备份它们,以免在关机时丢失。 检查...
    99+
    2023-10-26
    系统还原 服务器 电脑
  • 如何用GORM获取相关数据?
    本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《如何用GORM获取相关数据?》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~问题内容我想从其他表获取相关...
    99+
    2024-04-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作