leetcode 探索 佇列與棧 島嶼數量

2021-10-08 01:25:54 字數 1983 閱讀 1046

給你乙個由 『1』(陸地)和 『0』(水)組成的的二維網格,請你計算網格中島嶼的數量。

島嶼總是被水包圍,並且每座島嶼只能由水平方向或豎直方向上相鄰的陸地連線形成。

此外,你可以假設該網格的四條邊均被水包圍。

示例 1:

輸入:

11110

11010

11000

00000

輸出: 1

示例 2:

輸入:

11000

11000

00100

00011

輸出: 3

解釋: 每座島嶼只能由水平和/或豎直方向上相鄰的陸地連線而成。

就是探索連城一片的1的個數,採用廣度優先搜尋結合佇列實現,go中沒有佇列,採用slice實現,每次出隊slice就重新賦值。你可以把注釋掉的列印語句開啟,方便理解。

除了bfs,我們還有dfs,dfs採用遞迴,也就是系統的呼叫棧來實現。

兩者共同點,都需要標記已經被訪問過的元素,雖然這裡簡化了,是直接將元素據標記為0達到的。看起來dfs要更為簡潔明瞭,遞迴的思想,果然很強大,由於每次都處理相同的事情,那麼只要編寫處理一次的**,再遞迴自己,即可解決。

func

numislands

(grid [

]byte

)int

nr :=

len(grid)

nc :=

len(grid[0]

)var numisland =

0for r :=

range grid

)for

len(neighbors)!=0

)// enqueue

grid[row -1]

[col]

='0'

// 標記

}if row +

1< nr && grid[row+1]

[col]

=='1'

)// enqueue

grid[row+1]

[col]

='0'

// 標記

}if col +

1< nc && grid[row]

[col+1]

=='1'

)// enqueue

grid[row]

[col+1]

='0'

// 標記

}if col -

1>=

0&& grid[row]

[col-1]

=='1'

)// enqueue

grid[row]

[col-1]

='0'

// 標記

}// fmt.printf("queue is: %v\n", neighbors)}}

}}return numisland

}type pair struct

func

numislands

(grid [

]byte

)int

var numisland =

0for r :=

range grid }}

return numisland

}func

dfs(grid [

]byte

, row, col int

)

grid[row]

[col]

='0'

// 標記為已經搜尋過了

dfs(grid, row-

1, col)

dfs(grid, row+

1, col)

dfs(grid, row, col-1)

dfs(grid, row, col+1)

}

leetcode探索佇列和棧(一)

對於佇列,我們可以使用動態陣列和指向佇列頭部的索引來實現,當佇列資料較多時,陣列的容量要求較大,一種比較好的改進方法使用陣列實現迴圈佇列。我們來看一下leetcode給出的演示 可以得出 佇列滿時 tail 1 length head length為長度 隊列為空 head tail 迴圈佇列的方法...

LeetCode 棧與佇列

用乙個佇列就可以實現棧 取元素時要把佇列尾元素取出 最後進入佇列的元素 把前n 1個元素放到佇列尾並彈出,這樣佇列的頭部就是最後進入佇列的元素了,取出他即可 class mystack void push int x intpop int res que.front que.pop return r...

leetcode 探索佇列與棧 逆波蘭表示式

根據 逆波蘭表示法,求表示式的值。有效的運算子包括 每個運算物件可以是整數,也可以是另乙個逆波蘭表示式。說明 整數除法只保留整數部分。給定逆波蘭表示式總是有效的。換句話說,表示式總會得出有效數值且不存在除數為 0 的情況。示例 1 輸入 2 1 3 輸出 9 解釋 該算式轉化為常見的中綴算術表示式為...