婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Python 根據相鄰關系還原數組的兩種方式(單向構造和雙向構造)

Python 根據相鄰關系還原數組的兩種方式(單向構造和雙向構造)

熱門標簽:無錫智能外呼系統好用嗎 地圖標注與注銷 宿州電話機器人哪家好 成都呼叫中心外呼系統哪家強 西青語音電銷機器人哪家好 電梯新時達系統外呼顯示e 百應電話機器人總部 旅游廁所地圖標注怎么弄 南昌地圖標注

題目描述

這是 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 數值的首位,然后根據給定的相鄰關系進行「單向構造」,為了方便找到某個數其相鄰的數是哪些,我們還需要再開一個「哈希表」記錄相鄰關系。

Java 代碼:

class Solution {
    public int[] restoreArray(int[][] aps) {
        int m = aps.length, n = m + 1;
        MapInteger, Integer> cnts = new HashMap>();
        MapInteger, ListInteger>> 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);
            ListInteger> alist = map.getOrDefault(a, new ArrayList>());
            alist.add(b);
            map.put(a, alist);
            ListInteger> 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];
            ListInteger> 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] 范圍內的數值輸出作為答案即可。

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;
        MapInteger, ListInteger>> map = new HashMap>();
        for (int[] ap : aps) {
            int a = ap[0], b = ap[1];
            ListInteger> alist =  map.getOrDefault(a, new ArrayList>());
            alist.add(b);
            map.put(a, alist);
            ListInteger> 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];
        ListInteger> 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) {
            ListInteger> alist = map.get(q[l + 1]);
            int j = l;
            for (int i : alist) {
                if (i != q[l + 2]) q[j--] = i;
            }
            l = j;

            ListInteger> 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)+1n:
            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 相鄰還原數組內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Python使用zip合并相鄰列表項的方法示例
  • 利用python求相鄰數的方法示例
  • Python selenium 父子、兄弟、相鄰節點定位方式詳解

標簽:贛州 雅安 西安 辛集 渭南 許昌 七臺河 濰坊

巨人網絡通訊聲明:本文標題《Python 根據相鄰關系還原數組的兩種方式(單向構造和雙向構造)》,本文關鍵詞  Python,根據,相鄰關系,還原,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python 根據相鄰關系還原數組的兩種方式(單向構造和雙向構造)》相關的同類信息!
  • 本頁收集關于Python 根據相鄰關系還原數組的兩種方式(單向構造和雙向構造)的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    精品久久国产97色综合| 91精品免费观看| 国产精品自在欧美一区| 伦理电影国产精品| 黄一区二区三区| 国产超碰在线一区| 99久久综合狠狠综合久久| 99热这里都是精品| 欧美在线观看视频一区二区 | 欧美成人三级电影在线| 欧美刺激午夜性久久久久久久| 欧美一区二区女人| www成人在线观看| 国产精品欧美极品| 夜夜精品浪潮av一区二区三区| 亚洲一区二区三区影院| 美女脱光内衣内裤视频久久影院| 国产专区综合网| 99久久综合精品| 欧美日产在线观看| 久久婷婷国产综合国色天香| 国产精品福利在线播放| 亚洲午夜精品在线| 日本午夜一区二区| 成人综合日日夜夜| 欧美男同性恋视频网站| 2024国产精品| 亚洲精品国产无天堂网2021| 日本怡春院一区二区| 亚洲午夜免费电影| 精品精品国产高清a毛片牛牛 | 欧美精品久久99久久在免费线| 免费观看久久久4p| 成人网在线免费视频| 久久久久久电影| 国产在线观看一区二区| 成人午夜免费电影| 色欲综合视频天天天| 国产一区二区三区在线看麻豆| ...中文天堂在线一区| 日本高清免费不卡视频| 成人精品视频一区二区三区尤物| 亚洲乱码国产乱码精品精可以看 | 欧美国产一区二区| 日本不卡免费在线视频| 欧美日韩国产天堂| 久久精品国产免费看久久精品| 国产精品久久久久天堂| 五月天亚洲精品| 欧美日韩国产中文| 国产精品毛片高清在线完整版| 99久久99久久精品国产片果冻| 一区二区在线观看不卡| 婷婷开心激情综合| 91精品国产色综合久久ai换脸| 亚洲国产一区在线观看| 成人av网在线| 国产精品一区二区视频| 久久成人免费电影| 成人综合在线网站| 成人午夜又粗又硬又大| 欧美xxxxx牲另类人与| 日韩av一二三| 欧美午夜电影网| 一个色在线综合| 欧美性受极品xxxx喷水| 亚洲三级电影网站| 91浏览器在线视频| 亚洲欧美日韩在线播放| 99国产一区二区三精品乱码| 欧美国产乱子伦| 99re这里只有精品6| 国产精品久久久久久亚洲伦| aaa欧美色吧激情视频| 国产精品久久久久久久久久免费看 | 国产亚洲精品福利| 国产麻豆9l精品三级站| 久久久久久久久免费| 国产精品一区一区三区| 久久久一区二区三区捆绑**| 国产精选一区二区三区| 国产精品乱码妇女bbbb| 色综合久久久久久久久久久| 亚洲伦理在线精品| 欧美一区二视频| 国产一区二区不卡老阿姨| 国产女主播在线一区二区| 成人激情文学综合网| 亚洲精品高清在线观看| 51精品国自产在线| 国产自产v一区二区三区c| 国产精品日日摸夜夜摸av| 色域天天综合网| 美女在线一区二区| 国产精品国产三级国产普通话99| 色综合激情五月| 视频一区二区三区在线| 日本一区二区三区dvd视频在线| 色综合久久88色综合天天免费| 午夜激情久久久| 精品成人一区二区| 在线视频国内一区二区| 麻豆国产91在线播放| 亚洲欧美日韩中文字幕一区二区三区| 欧美偷拍一区二区| 岛国精品一区二区| 日产精品久久久久久久性色| 国产精品国产三级国产普通话三级| 欧美自拍偷拍一区| 高清不卡一二三区| 美女视频黄 久久| 亚洲啪啪综合av一区二区三区| 日韩一区二区麻豆国产| 91网站在线观看视频| 精品一区二区国语对白| 一区二区三区中文字幕| 久久精品欧美一区二区三区麻豆| 欧美日韩在线观看一区二区| 成人高清免费观看| 激情另类小说区图片区视频区| 亚洲一区二区av电影| 国产精品无圣光一区二区| 欧美电视剧在线观看完整版| 欧洲亚洲国产日韩| 99麻豆久久久国产精品免费优播| 紧缚奴在线一区二区三区| 亚洲成av人片一区二区| 国产欧美精品国产国产专区| 精品国内二区三区| 欧美福利视频一区| 欧美三区在线观看| 欧美中文字幕一区| 色综合中文字幕国产| 麻豆国产精品一区二区三区| 亚洲一区二区三区四区不卡| 亚洲人精品午夜| 亚洲欧美另类小说| 亚洲视频1区2区| 亚洲色欲色欲www| 亚洲视频一区二区免费在线观看| 久久久精品天堂| 国产欧美一区二区三区在线老狼 | 亚洲一级二级三级在线免费观看| 国产精品视频观看| 国产精品卡一卡二卡三| 中文字幕免费不卡| 日韩理论片一区二区| 亚洲精选视频在线| 亚洲综合在线第一页| 亚洲成av人**亚洲成av**| 亚洲国产精品嫩草影院| 亚洲成人免费电影| 一区二区三区久久| 午夜精品久久久久久久蜜桃app | 国产91丝袜在线播放九色| 国产高清不卡一区| av激情综合网| 欧美丝袜丝交足nylons| 777a∨成人精品桃花网| 精品国产精品网麻豆系列 | 欧美精品vⅰdeose4hd| 欧美一区国产二区| 精品免费视频.| 国产精品护士白丝一区av| 亚洲女人****多毛耸耸8| 首页国产丝袜综合| 韩国女主播成人在线观看| 99久久精品免费看| 欧美日韩国产美| 久久综合999| 亚洲激情网站免费观看| 奇米影视一区二区三区小说| 成人永久aaa| 欧美日韩一区二区欧美激情| 精品国精品自拍自在线| 亚洲图片欧美激情| 捆绑变态av一区二区三区| 成人美女在线视频| 91精品国产入口在线| 国产亚洲精品精华液| 一区二区三区高清| 国产一区二区精品久久91| 成人av在线电影| 欧美日韩国产另类一区| 国产精品理论片在线观看| 秋霞成人午夜伦在线观看| 岛国av在线一区| 日韩精品一区二区三区swag| 亚洲六月丁香色婷婷综合久久 | 在线看日韩精品电影| 久久久久9999亚洲精品| 亚洲一区二区三区不卡国产欧美| 国产一区美女在线| 欧美少妇性性性| 亚洲视频香蕉人妖| 风流少妇一区二区| 日韩美女在线视频| 亚洲成人av一区| 在线观看日韩精品| 国产精品美女一区二区三区|