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

您的位置:首頁技術(shù)文章
文章詳情頁

Python 根據(jù)相鄰關(guān)系還原數(shù)組的兩種方式(單向構(gòu)造和雙向構(gòu)造)

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

這是 LeetCode 上的 1743. 從相鄰元素對還原數(shù)組 ,難度為 中等。

Tag : 「哈希表」、「雙指針」、「模擬」

存在一個(gè)由 n 個(gè)不同元素組成的整數(shù)數(shù)組 nums ,但你已經(jīng)記不清具體內(nèi)容。好在你還記得 nums 中的每一對相鄰元素。給你一個(gè)二維整數(shù)數(shù)組 adjacentPairs ,大小為 n - 1 ,其中每個(gè) adjacentPairs[i] = [ui, vi] 表示元素 ui 和 vi 在 nums 中相鄰。題目數(shù)據(jù)保證所有由元素 nums[i] 和 nums[i+1] 組成的相鄰元素對都存在于 adjacentPairs 中,存在形式可能是 [nums[i], nums[i+1]] ,也可能是 [nums[i+1], nums[i]] 。這些相鄰元素對可以 按任意順序 出現(xiàn)。

返回 原始數(shù)組 nums 。如果存在多種解答,返回 其中任意一個(gè) 即可。

示例 1:

輸入:adjacentPairs = [[2,1],[3,4],[3,2]]

輸出:[1,2,3,4]

解釋:數(shù)組的所有相鄰元素對都在 adjacentPairs 中。特別要注意的是,adjacentPairs[i] 只表示兩個(gè)元素相鄰,并不保證其 左-右 順序。

示例 2:

輸入:adjacentPairs = [[4,-2],[1,4],[-3,1]]

輸出:[-2,4,1,-3]

解釋:數(shù)組中可能存在負(fù)數(shù)。另一種解答是 [-3,1,4,-2] ,也會(huì)被視作正確答案。

示例 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 題目數(shù)據(jù)保證存在一些以 adjacentPairs 作為元素對的數(shù)組單向構(gòu)造(哈希表計(jì)數(shù))

根據(jù)題意,由于所有的相鄰關(guān)系都會(huì)出現(xiàn)在 numsnumsnums 中,假設(shè)其中一個(gè)合法數(shù)組為 ansansans,長度為 nnn。

那么顯然 ans[0]ans[0]ans[0] 和 ans[n−1]ans[n - 1]ans[n−1] 在 numsnumsnums 中只存在一對相鄰關(guān)系,而其他 ans[i]ans[i]ans[i] 則存在兩對相鄰關(guān)系。

因此我們可以使用「哈希表」對 numsnumsnums 中出現(xiàn)的數(shù)值進(jìn)行計(jì)數(shù),找到“出現(xiàn)一次”的數(shù)值作為 ansansans 數(shù)值的首位,然后根據(jù)給定的相鄰關(guān)系進(jìn)行「單向構(gòu)造」,為了方便找到某個(gè)數(shù)其相鄰的數(shù)是哪些,我們還需要再開一個(gè)「哈希表」記錄相鄰關(guān)系。

Python 根據(jù)相鄰關(guān)系還原數(shù)組的兩種方式(單向構(gòu)造和雙向構(gòu)造)

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 時(shí)間復(fù)雜度:O(n)O(n)O(n) 空間復(fù)雜度:O(n)O(n)O(n)雙向構(gòu)造(雙指針)

在解法一中,我們通過「哈希表」計(jì)數(shù)得到 ansansans 首位的原始作為起點(diǎn),進(jìn)行「單向構(gòu)造」。那么是否存在使用任意數(shù)值作為起點(diǎn)進(jìn)行的雙向構(gòu)造呢?答案是顯然的,我們可以利用 ansansans 的長度為 2<=n<=1052 <= n <= 10^52<=n<=105,構(gòu)造一個(gè)長度 10610^6106 的數(shù)組 qqq(這里可以使用 static 進(jìn)行加速,讓多個(gè)測試用例共享一個(gè)大數(shù)組)。

這里 qqq 數(shù)組不一定要開成 1e61e61e6 大小,只要我們 qqq 大小大于 ansansans 的兩倍,就不會(huì)存在越界問題。

從 qqq 數(shù)組的 中間位置 開始,先隨便將其中一個(gè)元素添加到中間位置,使用「雙指針」分別往「兩邊拓展」(l 和 r 分別指向左右待插入的位置)。

當(dāng) l 指針和 r 指針直接已經(jīng)有 nnn 個(gè)數(shù)值,說明整個(gè) ansansans 構(gòu)造完成,我們將 [l+1,r−1][l + 1, r - 1][l+1,r−1] 范圍內(nèi)的數(shù)值輸出作為答案即可。

Python 根據(jù)相鄰關(guān)系還原數(shù)組的兩種方式(單向構(gòu)造和雙向構(gòu)造)

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

時(shí)間復(fù)雜度:O(n)O(n)O(n)空間復(fù)雜度:O(n)O(n)O(n)

最后

到此這篇關(guān)于Python 根據(jù)相鄰關(guān)系還原數(shù)組的兩種方式(單向構(gòu)造和雙向構(gòu)造)的文章就介紹到這了,更多相關(guān)Python 相鄰還原數(shù)組內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩99| 亚洲欧美久久| 国产日韩欧美三区| 国产日韩一区| 国产精选一区| 久久精品三级| 亚洲欧洲美洲av| 日本精品不卡| 婷婷综合在线| 亚洲免费高清| 中文在线日韩| 久久gogo国模啪啪裸体| 国产不卡精品在线| 久久精品高清| 视频一区二区中文字幕| 日本不卡一区二区| 久久av超碰| 午夜精品成人av| 久久不射网站| 国产探花一区| 国产精品蜜芽在线观看| 国产精品99免费看| 亚洲人成网站在线在线观看| 国产日产一区| 精品一区电影| 久久久久蜜桃| 亚洲欧美网站在线观看| 国产一区 二区| 亚洲欧美伊人| 婷婷综合国产| 97精品中文字幕| 香蕉视频成人在线观看| 人人爱人人干婷婷丁香亚洲| 四虎国产精品免费观看| 性欧美69xoxoxoxo| 日韩高清成人在线| 99国产一区| 久久av导航| 亚洲免费观看| 国产毛片久久久| 亚洲综合在线电影| 深夜日韩欧美| 精品中文字幕一区二区三区| 在线国产一区| 国产日产高清欧美一区二区三区| 免费看av不卡| 亚洲一级淫片| 欧美少妇精品| 综合一区二区三区| 福利视频一区| 午夜视频一区二区在线观看| 毛片在线网站| 日本伊人午夜精品| 久久亚洲国产| 日韩不卡免费视频| 久久国产成人午夜av影院宅| 欧美日韩a区| 亚洲第一精品影视| 捆绑调教美女网站视频一区| 首页国产欧美久久| 日韩毛片视频| 久久精品99国产精品日本| 婷婷色综合网| 国产一区二区三区黄网站| 香蕉成人久久| 日韩一区电影| 青青伊人久久| 黄色av一区| 欧美日韩国产观看视频| 日本一区中文字幕| 国产一区日韩一区| 国内精品伊人| 欧美日本不卡| 亚洲欧美日韩国产一区| 久久精品系列| 久久激情五月婷婷| 亚洲性视频在线| 亚洲精品极品少妇16p| 97欧美在线视频| 久久国产婷婷国产香蕉| 视频一区二区欧美| 欧美中文字幕一区二区| 精品国产一区二区三区av片| 亚洲精品免费观看| 欧美网站在线| 日本综合字幕| 国内自拍视频一区二区三区| 久久精品av麻豆的观看方式| 日韩一区欧美二区| 午夜久久福利| 久久在线免费| 韩国三级一区| 国产精品伦理久久久久久| 精品日本视频| 国产精品免费精品自在线观看| 亚洲精品欧美| 免费人成精品欧美精品 | 中文在线а√在线8| 久久精品av麻豆的观看方式| 在线免费观看亚洲| 91超碰国产精品| 欧美综合另类| 91九色精品国产一区二区| 久久久久午夜电影| 免费污视频在线一区| 97人人精品| 国产传媒av在线| 国产精品久久久久久久久久10秀| 久久久亚洲欧洲日产| 欧美亚洲三区| 欧美午夜三级| 国产日韩欧美在线播放不卡| 亚洲一区国产一区| 99久久久久| 999国产精品| 精品欧美激情在线观看| 欧美日韩黑人| 蜜桃成人av| 亚洲深夜av| 在线视频亚洲欧美中文| 午夜电影一区| 国产日韩欧美三级| 国产精品白浆| 欧美国产中文高清| 欧美成人一二区| 色欧美自拍视频| 欧美日韩精品免费观看视欧美高清免费大片 | 999国产精品| 欧美va天堂在线| 国产精品嫩草99av在线| 在线精品视频一区| 日韩国产成人精品| 日韩精品第二页| 国产精品久久乐| 首页国产精品| 欧美日韩在线播放视频| 国产一区二区精品| 亚欧成人精品| 亚洲69av| 国产欧美日韩综合一区在线播放| 久久精品国产久精国产爱| 不卡一二三区| 亚洲欧美成人综合| 国产情侣久久| 欧美一区久久久| 好看的av在线不卡观看| 亚洲精品美女| 精品国产麻豆| 国产精品88久久久久久| 日本亚洲视频在线| 欧美精品不卡| 91精品一区国产高清在线gif| 久久aⅴ国产紧身牛仔裤| 亚洲精品国模| 久久精品午夜| 欧美日韩色图| 亚洲视频二区| 精品精品久久| 亚洲欧美日韩一区在线观看| 欧美综合精品| 日韩精品欧美激情一区二区| 免费在线观看精品| 美女免费视频一区| 亚洲二区在线| 日本少妇一区二区| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 日本精品一区二区三区在线观看视频| 国产精品毛片视频| 激情偷拍久久| 国产剧情在线观看一区| 久久亚洲国产| 国产麻豆一区| 1024精品一区二区三区| 日韩精品视频在线看| 日韩免费一区| 久久亚洲一区| caoporn视频在线| 亚洲va久久久噜噜噜久久| 国产资源在线观看入口av| 亚洲有吗中文字幕| 亚洲黄色网址| 日本视频中文字幕一区二区三区| www.51av欧美视频| 综合一区在线| 久久久成人网| 国产日韩视频在线| 成人av动漫在线观看| 国产精品igao视频网网址不卡日韩 | 免费久久精品| 69堂精品视频在线播放| 免费观看久久av| 美腿丝袜亚洲三区| 久久国产成人| 精品免费av在线| 国产精品一区亚洲| 日韩午夜免费| 国产美女高潮在线观看| 青青国产精品| 免费国产自线拍一欧美视频| 国产精品va视频|