日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:106日期:2022-07-28 08:44:00
目錄題目描述示例 2:示例 3:單向構造(哈希表計數)雙向構造(雙指針)最后題目描述

這是 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 += 1cnts = 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 = -1for i, v in cnts.items(): if v == 1:start = ibreakans = [0] * nans[0] = startans[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] = jreturn 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 + 1hashmap = defaultdict(list)for a, b in adjacentPairs: hashmap[a].append(b) hashmap[b].append(a)l = self.N // 2r = l + 1std = adjacentPairs[0][0]lt = hashmap[std]self.q[l] = stdl -= 1self.q[r] = lt[0]r += 1if len(lt) > 1: self.q[l] = lt[1] l -= 1while (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 = jblt = hashmap[self.q[r-1]] j = r for i in blt:if i != self.q[r - 2]: self.q[j] = i j += 1 r = jans = [0] * nfor 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 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
中文在线中文资源| 亚洲综合电影一区二区三区| 日韩精品一二三| 亚洲电影有码| 亚洲二区视频| 在线综合亚洲| 视频在线在亚洲| 亚洲一区二区三区四区电影| 亚洲精品乱码| 综合精品一区| 欧美中文一区| 久久精品99久久久| 你懂的亚洲视频| 久久亚洲精精品中文字幕| 精品久久美女| 九色porny丨国产首页在线| 福利在线免费视频| 久久天堂精品| 欧美日韩国产综合网| 天堂成人国产精品一区| 日韩欧美中文在线观看| 国产精品网在线观看| 国产日韩电影| 欧美精品自拍| 色狠狠一区二区三区| 国产视频一区二| 精品国产一区二区三区av片| 国产成人在线中文字幕| 91精品啪在线观看国产18| 最新日韩av| 日本h片久久| 久久99久久久精品欧美| 日韩中文在线播放| 美女精品在线| 国产精品红桃| 麻豆精品蜜桃| 中文字幕免费一区二区| 国产精品丝袜在线播放| 亚洲最新无码中文字幕久久| 久久xxxx| 国产中文欧美日韩在线| 制服诱惑一区二区| 国产欧美日韩在线一区二区| 国产综合色区在线观看| 亚洲一级淫片| 四虎国产精品免费观看| 免费av一区| 欧美日本三区| 色88888久久久久久影院| 亚洲精品系列| 国产在线不卡一区二区三区| 国产亚洲亚洲| 久久香蕉网站| 日韩制服丝袜av| 丁香婷婷久久| 亚洲在线成人| 精品亚洲成人| 亚洲综合中文| 欧美日韩精品免费观看视欧美高清免费大片| 久久香蕉精品| 91视频精品| 一区二区日韩免费看| 国产拍在线视频| 日本一区中文字幕| 久久久久国产精品一区二区| 日韩欧美久久| 亚洲国产综合在线看不卡| 国产日韩一区二区三区在线播放 | 美日韩精品视频| 高清一区二区三区av| 一本综合精品| 欧美一区二区三区激情视频| 久久成人高清| 亚洲开心激情| 色偷偷色偷偷色偷偷在线视频| 亚洲网址在线观看| 久久精品国产99久久| 精品一区91| 日韩av黄色在线| 国产精品日本| 99久久激情| 国产一区二区精品久| 奇米亚洲欧美| 亚洲精品午夜av福利久久蜜桃| 久久99精品久久久野外观看| 亚洲人成在线影院| 婷婷六月综合| 亚洲啊v在线| 国产精品jk白丝蜜臀av小说| 美日韩精品视频| 亚洲二区免费| 九九色在线视频| 日韩av在线中文字幕| 国产精品视频一区二区三区四蜜臂| 亚洲在线国产日韩欧美| 日韩免费小视频| 麻豆91小视频| 欧美精品影院| 日韩高清一区在线| 男女性色大片免费观看一区二区| 久久中文字幕av一区二区不卡| 三上亚洲一区二区| 国产精品1区| 青草综合视频| 免费人成网站在线观看欧美高清| 欧美日韩精品在线一区| 丝袜诱惑一区二区| 成人午夜毛片| 福利精品在线| 精品一区二区三区四区五区| 久久精品凹凸全集| 欧美啪啪一区| 欧美久久一区二区三区| 日韩黄色免费网站| 日韩精品欧美大片| 日韩精品一区二区三区中文| 亚洲伊人精品酒店| 蜜桃av一区二区| 另类亚洲自拍| 欧美日韩视频一区二区三区| 91精品久久久久久久久久不卡| 日本综合字幕| 深夜视频一区二区| 免费毛片在线不卡| 影院欧美亚洲| 亚洲一区二区三区免费在线观看| 欧美日韩精品免费观看视频完整| re久久精品视频| 国产亚洲精品自拍| 蜜桃视频一区二区三区在线观看| 亚洲人成网站在线在线观看| 日本视频中文字幕一区二区三区| 日本91福利区| 国产精品va视频| 久久不卡日韩美女| 麻豆91小视频| 精精国产xxxx视频在线播放| 国产高清一区二区| 免费精品视频最新在线| 亚洲精品亚洲人成在线观看| 天堂va欧美ⅴa亚洲va一国产| 日韩精品国产欧美| 国产精品一区二区中文字幕| 嫩草伊人久久精品少妇av杨幂| 久久只有精品| 中文字幕在线看片| 欧美在线影院| 中文字幕亚洲精品乱码| 国产欧美一区二区三区米奇| 麻豆精品一区二区综合av| 国产一区二区三区不卡视频网站 | 久久人人精品| 欧美一级专区| 日韩二区三区四区| 成人污污视频| 欧美精品一区二区久久| 亚洲综合小说| 精品视频网站| 蜜臀91精品国产高清在线观看| 亚洲在线久久| 国产精品久av福利在线观看| 91日韩免费| 亚洲欧美日韩国产一区二区| 日本不卡一区二区三区| 精品午夜av| 99在线|亚洲一区二区| 亚洲精品无播放器在线播放| 欧美a级一区二区| 免费观看不卡av| 国产调教精品| 欧美日韩一二三四| 欧美天堂在线| 国产综合婷婷| 国产亚洲精aa在线看 | а√天堂8资源中文在线| 伊人久久大香线蕉av超碰演员| 亚洲专区视频| 日韩精品91| 一区二区三区网站| 久久影院午夜精品| 视频一区在线视频| 麻豆国产91在线播放| 99国产精品免费视频观看| 亚洲免费一区三区| 91看片一区| 日韩激情中文字幕| 亚洲成人二区| 欧美激情福利| 久久福利影视| 激情综合五月| 最新亚洲国产| 日韩在线不卡| 欧美一级二级视频| 尤物在线精品| 精品久久精品| 在线观看视频免费一区二区三区| 成人午夜亚洲| 91午夜精品| 91超碰国产精品| 久久av影院|