並查集--算法題

leetcode-200 islands

題意:

給出一個二維數組,只包含 1/0 。1表示陸地,0表示水,求島嶼個數。例:數組

input:微信

1 1 0 0 0  
1 1 0 0 0  
0 0 1 0 0  
0 0 0 1 1 
複製代碼

output:spa

3code

思路

  • 染色法
  1. 遍歷數組
  2. 若是爲1,則找到相鄰的全部爲1的節點,賦值爲0,同時count++

2能夠用DFS和BFS實現。cdn

如下代碼會對更改源數組,推薦用visited[]。leetcode

DFS:每一個節點都判斷附近有沒爲1的節點,僞代碼以下:get

function DFS(x, y) if (int[x][y] := 1){
            int[x][y] := 0
            DFS(x, y+1)
            DFS(x, y-1)
            DFS(x+1, y)
            DFS(x-1, y)
        }
複製代碼

BFS:將全部附近爲1的節點都放到queue中,再逐個清理input

function BFS(x, y) q.offer(x, y) while (!q.isEmpty){
            (i, j) := q.poll()
            int(i, j) := 0
            if int[i+1][j] := 1 q.offer(i+1, j)
            if int[i-1][j] := 1 q.offer(i-1, j)
            if int[i][j+1] := 1 q.offer(i, j+1)
            if int[i][j-1] := 1 q.offer(i, j-1)
        }
複製代碼
  • 並查集
  1. 初始化「1」的節點的root爲本身
  2. 遍歷全部節點,相鄰合併(只作統計這裏能夠)
  3. 遍歷parent,獲取詳情

leetcode-547 Friend Circle

題意

給定一個二維矩陣(權圖),1表示認識,0表示不認識,求有多少朋友圈。例:it

A B C  
A  1 1 0  
B  1 1 0  
C  0 0 1  
複製代碼

思路

這題和leetcode-200實際上是同樣的,若是有連續相連的「1」,說明這些人互相認識,也就是一個朋友圈,求朋友圈個數也是求有多少個島嶼;也是典型的圖的邊的矩陣表示方式。io

leetcode-200、547直接用並查集方法便可,詳見並查集-理論


歡迎關注微信公衆號,提供思想和技術類原創文章。微信搜索小兵張健或掃描如下二維碼。

相關文章
相關標籤/搜索