給乙個01矩陣,1代表是陸地,0代表海洋, 如果兩個1相鄰,那麼這兩個1屬於同乙個島。我們只考慮上下左右為相鄰。
島嶼: 相鄰陸地可以組成乙個島嶼(相鄰:上下左右) 判斷島嶼個數。
輸入[[1,1,0,0,0],[0,1,0,1,1],[0,0,0,1,1],[0,0,0,0,0],[0,0,1,1,1]]
輸出遍歷陣列,將相鄰的島嶼的置為1(可以通過dfs或bfs的方式),然後繼續判斷。3
dfs:從乙個為1的根節點開始訪問,從每個相鄰1節點向下訪問到頂點(周圍全是水),依次訪問其他相鄰1節點到頂點
bfs:為了求出島嶼的數量,我們可以掃瞄整個二維網格。如果乙個位置為 1,則將其加入佇列,開始進行廣度優先搜尋。在廣度優先搜尋的過程中,每個搜尋到的 1 都會被重新標記為 0。直到隊列為空,搜尋結束。
// 思路1
public
class
solution
grid[r]
[c]=
'0';
dfs(grid, r -
1, c)
;dfs
(grid, r +
1, c)
;dfs
(grid, r, c -1)
;dfs
(grid, r, c +1)
;}public
intnumislandsbydfs
(char
grid)
int len = grid.length;
int len1 = grid[0]
.length;
int numislands =0;
for(
int r =
0; r < len;
++r)}}
return numislands;
}}
時間複雜度分析:o(mn):遍歷二維陣列
空間複雜度分析:o(mn):這裡的空間複雜度主要是針對遞迴的深度,最壞的情況下,二維陣列都是1,則需要一直遞迴完整個二維陣列
// 思路2
public
class
solution
int len = grid.length;
int len1 = grid[0]
.length;
int numislands =0;
for(
int r =
0; r < len;
++r)
if(row +
1< len && grid[row +1]
[col]
=='1')if
(col -
1>=
0&& grid[row]
[col -1]
=='1')if
(col +
1< len1 && grid[row]
[col +1]
=='1')}
}}}return numislands;
}}
時間複雜度分析:o(mn):遍歷二維陣列
空間複雜度分析:小夥伴如果想測試的話,可以直接到牛客網這個鏈結做測試o(min(m,n)):在最壞情況下,整個網格均為陸地,佇列的大小可以達到 min(m,n)。
島嶼數量-牛客網
牛客題霸 島嶼數量
給定乙個方格圖,求聯通塊的個數。求聯通塊,並查集可做。我們可以把所有相鄰的兩個是1的位置,用並查集合並起來,最後計算有多少個並查集即可。具體實現 掃瞄整個地圖,如果是1,看其上下左右是不是1,如果是,合併。詳見 附有注釋。class solution int dy 4 int getid int x...
牛客網刷題
時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 立華奏在學習初中數學的時候遇到了這樣一道大水題 設箱子內有 n 個球,其中給 m 個球打上標記,設一次摸球摸到每乙個球的概率均等,求一次摸球摸到打標記的球的概率 e...
牛客網刷題
時間限制 c c 2秒,其他語言4秒 空間限制 c c 524288k,其他語言1048576k 64bit io format lld 立華奏是乙個剛剛開始學習 oi 的萌新。最近,實力強大的 qingyu 當選了 iods 9102 的出題人。眾所周知,iods 是一場極其毒瘤的比賽。為了在這次...