最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年07月27日 10:29:37   作者:宮水三葉的刷題日記  
本文主要介紹了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 數值的首位,然后根據給定的相鄰關系進行「單向構造」,為了方便找到某個數其相鄰的數是哪些,我們還需要再開一個「哈希表」記錄相鄰關系。

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] 范圍內的數值輸出作為答案即可。

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

相關文章

  • Python輸出漢字字庫及將文字轉換為圖片的方法

    Python輸出漢字字庫及將文字轉換為圖片的方法

    這篇文章主要介紹了Python輸出漢字字庫及將文字轉換為圖片的方法,分別用到了codecs模塊和pygame模塊,需要的朋友可以參考下
    2016-06-06
  • Python多層裝飾器用法實例分析

    Python多層裝飾器用法實例分析

    這篇文章主要介紹了Python多層裝飾器用法,結合實例形式簡單分析了Python多層裝飾器的相關使用方法與注意事項,需要的朋友可以參考下
    2018-02-02
  • 利用Python+OpenCV三步去除水印

    利用Python+OpenCV三步去除水印

    去水印需要用到的庫:cv2、numpy,cv2是基于OpenCV的圖像處理庫,可以對圖像進行腐蝕,膨脹等操作.numpy這是一個強大的處理矩陣和維度運算的庫,,需要的朋友可以參考下
    2021-05-05
  • python爬蟲控制aiohttp并發(fā)數量方式

    python爬蟲控制aiohttp并發(fā)數量方式

    這篇文章主要介紹了python爬蟲控制aiohttp并發(fā)數量方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Python3使用騰訊云文字識別(騰訊OCR)提取圖片中的文字內容實例詳解

    Python3使用騰訊云文字識別(騰訊OCR)提取圖片中的文字內容實例詳解

    這篇文章主要介紹了Python3使用騰訊云文字識別(騰訊OCR)提取圖片中的文字內容方法詳解,需要的朋友可以參考下
    2020-02-02
  • Python實現一行代碼自動繪制藝術畫

    Python實現一行代碼自動繪制藝術畫

    DiscoArt?是一個很牛的開源模塊,它能根據你給定的關鍵詞自動繪畫。本文就將利用這一模塊實現一行代碼自動繪制藝術畫,需要的可以參考一下
    2022-12-12
  • Python中的json內置庫詳解

    Python中的json內置庫詳解

    這篇文章主要介紹了Python中的json內置庫詳解,在學習做自動化測試的過程中,python 里有一個內置的 json 庫,必須要學習好,json 是用于存儲和交換數據的語法,是一種輕量級的數據交換式使用場景,需要的朋友可以參考下
    2023-08-08
  • Python中文分詞庫jieba,pkusegwg性能準確度比較

    Python中文分詞庫jieba,pkusegwg性能準確度比較

    這篇文章主要介紹了Python中文分詞庫jieba,pkusegwg性能準確度比較,需要的朋友可以參考下
    2020-02-02
  • 22個Python的萬用公式分享

    22個Python的萬用公式分享

    在大家的日常python程序的編寫過程中,都會有自己解決某個問題的解決辦法,或者是在程序的調試過程中,用來幫助調試的程序公式。小編通過幾十萬行代碼的總結處理,總結出了22個python萬用公式,可以幫助大家解決在日常的python編程中遇到的大多數問題,一起來看看吧
    2022-12-12
  • Python中不可變數據類型原理與實戰(zhàn)全解析

    Python中不可變數據類型原理與實戰(zhàn)全解析

    在Python的世界里,數據對象被明確劃分為兩大陣營:可變(Mutable)與不可變(Immutable),而本文將為大家詳細介紹一下其中的不可變數據,感興趣的可以了解下
    2025-04-04

最新評論

昂仁县| 张家口市| 靖远县| 吉首市| 民乐县| 长沙市| 彭州市| 信丰县| 罗源县| 武安市| 渝北区| 枣阳市| 桑日县| 湖南省| 平湖市| 普宁市| 故城县| 庆安县| 万载县| 稻城县| 张家港市| 定结县| 英吉沙县| 天台县| 湄潭县| 南安市| 芜湖市| 长子县| 基隆市| 金秀| 勃利县| 宁化县| 彰武县| 神木县| 三台县| 扬州市| 政和县| 罗江县| 土默特左旗| 涿州市| 灵台县|