示例 2:
輸入:11000
11000
00100
00011
輸出: 3
廣度優先搜尋(也稱寬度優先搜尋,縮寫bfs,以下採用廣度來描述)是連通圖的一種遍歷演算法這一演算法也是很多重要的圖的演算法的原型。dijkstra單源最短路徑演算法和prim最小生成樹演算法都採用了和寬度優先搜尋類似的思想。其別名又叫bfs,屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位置,徹底地搜尋整張圖,直到找到結果為止。基本過程,bfs是從根節點開始,沿著樹(圖)的寬度遍歷樹(圖)的節點。如果所有節點均被訪問,則演算法中止。一般用佇列資料結構來輔助實現bfs演算法。
偽**
void bfs()}}
}
解題
線性掃瞄整個二維網格,如果乙個結點包含 1,則以其為根結點啟動廣度優先搜尋。將其放入佇列中,並將值設為 0 以標記訪問過該結點。迭代地搜尋佇列中的每個結點,直到隊列為空。
public
static
intnumislands
(char
grid)
int count =0;
//島嶼的數量
int y = grid.length;
//水域的高度
int x = grid[0]
.length;
//水域的寬度
//遍歷每個區域 x y 代表其座標。
for(
int y =
0; y < y; y++)if
(y1 +
1< y && grid[y1 +1]
[x1]
=='1')if
(x1 -
1>=
0&& grid[y1]
[x1 -1]
=='1')if
(x1 +
1< x && grid[y1]
[x1 +1]
=='1')}
}}}return count;
}
複雜度分析
深度優先搜尋屬於圖演算法的一種,是乙個針對圖和樹的遍歷演算法,英文縮寫為dfs即depth first search。深度優先搜尋是圖論中的經典演算法,利用深度優先搜尋演算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。一般用堆資料結構來輔助實現dfs演算法。其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。
偽**
void dfs(結點型別 current)
while(current 還可以擴充套件)
置visited[current]
=flase; // 表示結點current以後可能被處理
}
解題
線性掃瞄整個二維網格,如果乙個結點包含 1,則以其為根結點啟動深度優先搜尋。在深度優先搜尋過程中,每個訪問過的結點被標記為 0。計數啟動深度優先搜尋的根結點的數量,即為島嶼的數量。
public
static
void
dfs(
char
grid,
int x,
int y)
grid[y]
[x]=
'0';
dfs(grid, x-
1, y)
;dfs
(grid, x+
1, y)
;dfs
(grid, x, y-1)
;dfs
(grid, x, y+1)
;}public
static
intnumislands2
(char
grid)
int count =0;
//島嶼的數量
int y = grid.length;
//水域的高度
int x = grid[0]
.length;
//水域的寬度
//遍歷每個區域 x y 代表其座標。
for(
int y =
0; y < y; y++)}
}return count;
}
複雜度分析 演算法題 島嶼數量 深度優先搜尋
昨天在leetcode做的一道題,記錄下 給定乙個由 1 陸地 和 0 水 組成的的二維網格,計算島嶼的數量。乙個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四個邊均被水包圍。示例 1 輸入 11110 11010 11000 00000 輸出 1 示例 2 輸...
力扣 200島嶼數量 (深度優先遍歷 沉島思想)
給你乙個由 1 陸地 和 0 水 組成的的二維網格,請你計算網格中島嶼的數量。島嶼總是被水包圍,並且每座島嶼只能由水平方向和 或豎直方向上相鄰的陸地連線形成。此外,你可以假設該網格的四條邊均被水包圍。示例 1 輸入 11110 11010 11000 00000 輸出 1示例 2 輸入 11000 ...
深度優先 求迷宮中包含最多珠寶的路徑
include 實現1 用棧 int n int maze 11 11 int jewels count 迷宮maze中入口 0,0 出口 n 1,n 1 迷宮是二維n n的陣列表示,0表示通路,1表示障礙物,2表示珠寶jewel 求迷宮中包含最多珠寶的路徑 該路徑上的珠寶數目以及路徑 每點用3表示...