牛客網刷題 島嶼數量

2021-10-19 23:00:32 字數 1848 閱讀 2457

給乙個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]]

輸出

3

遍歷陣列,將相鄰的島嶼的置為1(可以通過dfs或bfs的方式),然後繼續判斷。

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 是一場極其毒瘤的比賽。為了在這次...