国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

算法之不定期更新(三)(2018-04-24)

darryrzhong / 3098人閱讀

摘要:實(shí)現(xiàn)這個(gè)想法之后就發(fā)現(xiàn),時(shí)間復(fù)雜度真的太高了。本期算法小分享就到這里咯剛做完探索里的初級(jí),還有好多已經(jīng)說爛了的題就不分享了。如果有什么意見或者想法歡迎在評(píng)論區(qū)和我交流

題目

input:

n // 代表無向圖的頂點(diǎn)數(shù) // 從1開始

m // 無向圖的邊數(shù)

arr1 // 各邊的情況,形如[[1, 2], [3, 4],...](代表頂點(diǎn)0和頂點(diǎn)2相連,頂點(diǎn)3和頂點(diǎn)4相連)

arr2 // 希望求得的連通情況數(shù)組,形如[[1, 3], [1, 4], ...] (代表希望知道頂點(diǎn)1,頂點(diǎn)3的連通情況,頂點(diǎn)1和頂點(diǎn)4的連通情況)

output: numarr2中可以連通的數(shù)量

示例: input:

n = 3

m = 1

arr1 = [[1, 3]]

arr2 = [[2, 3]]

output: 0

下面是我解決這個(gè)題的時(shí)候的思路

解題思路

這個(gè)題,剛拿到的時(shí)候,我最初的想法是使用無向圖的鄰接矩陣,然后在檢查點(diǎn)的時(shí)候通過廣度優(yōu)先遍歷查看兩個(gè)點(diǎn)是否連通。實(shí)現(xiàn)這個(gè)想法之后就發(fā)現(xiàn),時(shí)間復(fù)雜度真的太高了。每一次都會(huì)產(chǎn)生許多的無用查詢。

然后我想了另外一個(gè)思路,既然只查詢兩個(gè)點(diǎn)是否連通,那么我們維護(hù)一個(gè)連通集合不就可以了。一開始每一個(gè)孤立的點(diǎn)都是一個(gè)多帶帶的連通集合,形如["1", "2", "3", "4"],在加上一條邊之后,就是該邊的兩個(gè)頂點(diǎn)所在的連通集合合并成同一個(gè)連通集合,即加上邊[1, 3]后,連通集合變成["13", "2", "4"]。這樣,在查詢的時(shí)候,去尋找頂點(diǎn)B是否在頂點(diǎn)A所處的連通集合里就可以了。于是我寫出了如下的代碼。

代碼
function solution(n, m, arr1, arr2) {
    let hash = new Array(n + 1) // 代表每個(gè)點(diǎn)的所在的連通集合,undefined代表這個(gè)點(diǎn)還不與其他點(diǎn)相連,0位無效
    let map = {} // 保留每個(gè)聯(lián)通集合的點(diǎn)集
    let index = 1 // 下一個(gè)聯(lián)通集合的編號(hào)
    for (let i = 0; i < m; i++) { // 依次添加邊到連通集合里
        let edge = arr1[i]
        let A = edge[0] // 頂點(diǎn)A
        let B = edge[1] // 頂點(diǎn)B
        if (hash[A] === undefined && hash[B] === undefined) { // 這兩個(gè)都是孤立的點(diǎn),新建一個(gè)連通集合
            hash[A] = index
            hash[B] = index
            map[index++] = [A, B]
        } else if (hash[B] === undefined) { // 點(diǎn)A不是孤立的,點(diǎn)B是孤立的,把B加入A的連通集合里
            hash[B] = hash[A]
            map[hash[A]].push(B)
        } else if (hash[A] === undefined) { // 點(diǎn)B不是孤立的,點(diǎn)A是孤立的,把A加入B的連通集合里
            hash[A] = hash[B]
            map[hash[B]].push(A)
        } else if (hash[A] !== hash[B]) { // A,B均不是孤立的,把B的連通集合,加入A的連通集合里
            B_list = map[hash[B]] // B所在的連通集合的頂點(diǎn)列表
            group = hash[A]
            for (let i = B_list.length - 1; i >= 0; i--) { // 每個(gè)頂點(diǎn)的連通集合修改為A的
                hash[B_list[i]] = group
            }
            map[group] = map[group].concat(map[hash[B]])
            delete map[hash[B]]
        }
    }
    let result = 0 // 連通的數(shù)量
    for (let i = arr2.length - 1; i >= 0; i--) {
        let test = arr2[i]
        let groupA = hash[test[0]]
        let groupB = hash[test[1]]
        if (groupA && groupB && groupA === groupB) {
            result++
        }
    }
    return result
}

也就是,用hash來存放對(duì)應(yīng)的點(diǎn)所在的連通集合,map存放連通集合對(duì)應(yīng)的點(diǎn)。

本期算法小分享就到這里咯(leetcode剛做完探索里的初級(jí),還有好多已經(jīng)說爛了的題就不分享了。)如果有什么意見或者想法歡迎在評(píng)論區(qū)和我交流

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/94559.html

相關(guān)文章

  • 算法定期更新(二)(2018-04-15)

    摘要:題目中的數(shù)字可以分割出來的連續(xù)數(shù)字串的所有組合,不同組合之間用一個(gè)和連接示例和和和和和和和和和和這里給同學(xué)提個(gè)醒。。解題思路利用二叉樹。說到這這個(gè)題就很容易解決了,利用二叉樹的層次遍歷,每一層遍歷的時(shí)候都基于上一層的遍歷結(jié)果生成答案。 題目 input: noutput: 1...n中的數(shù)字可以分割出來的連續(xù)數(shù)字串的所有組合,不同組合之間用一個(gè)和連接 示例:input: 3output...

    Aklman 評(píng)論0 收藏0
  • 算法定期更新(四)—— 從前序與中序遍歷序列構(gòu)造二叉樹(2018-06-02)

    摘要:樹的前序,中序遍歷的結(jié)構(gòu)如下圖可以看出,通過前序遍歷可以確定根節(jié)點(diǎn),再通過中序遍歷和根節(jié)點(diǎn)的位置可以確定出左子樹和右子樹。另外左子樹的前序遍歷和中序遍歷的順序跟在其父樹中的順序一樣。因此可以確定有一種遞歸解法。 從前序與中序遍歷序列構(gòu)造二叉樹 今天帶來的是Leetcode上的一個(gè)經(jīng)典題:從前序與中序遍歷序列構(gòu)造二叉樹原題干: /** Definition for a binary ...

    charles_paul 評(píng)論0 收藏0
  • 算法定期更新(一)(2018-04-12)

    摘要:算法的確有他獨(dú)特的魅力。然后我在做這個(gè)題的時(shí)候,其實(shí)也用到了類似質(zhì)因數(shù)分解,只是其實(shí)我們可以更好的利用到因數(shù)這一個(gè)特性。判斷一個(gè)數(shù)是否是質(zhì)數(shù)質(zhì)數(shù)列表一開始我們認(rèn)為每一個(gè)數(shù)都可能是自身的冪線性篩為質(zhì)數(shù)遍歷質(zhì)數(shù)列表為質(zhì)數(shù)的冪 前言 從三月份到現(xiàn)在,大大小小筆試了十幾家公司(主要是因?yàn)橐恢眘olo code,沒人內(nèi)推),然后也能感覺到自己的進(jìn)步把。從編程題只能ac一題到后來的ak。今天面騰訊...

    Martin91 評(píng)論0 收藏0
  • CSS技巧

    摘要:技巧使你的更加專業(yè)這是上關(guān)于技巧的一篇譯文,另外你也可以在本項(xiàng)目看到原文。列舉了一些很實(shí)用的技巧,比如給空內(nèi)容的標(biāo)簽添加內(nèi)容,逗號(hào)分隔列表等等。排序算法看源碼,把它背下來吧排序算法的封裝。主要幫助初學(xué)者更好的掌握排序算法的實(shí)現(xiàn)。 成為專業(yè)程序員路上用到的各種優(yōu)秀資料、神器及框架 成為一名專業(yè)程序員的道路上,需要堅(jiān)持練習(xí)、學(xué)習(xí)與積累,技術(shù)方面既要有一定的廣度,更要有自己的深度。 Java...

    DangoSky 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<