給你乙個由 『1』(陸地)和 『0』(水)組成的的二維網格,請你計算網格中島嶼的數量。
島嶼總是被水包圍,並且每座島嶼只能由水平方向或豎直方向上相鄰的陸地連線形成。
此外,你可以假設該網格的四條邊均被水包圍。
示例 1:
輸入:示例 2:11110
11010
11000
00000
輸出: 1
輸入:就是探索連城一片的1的個數,採用廣度優先搜尋結合佇列實現,go中沒有佇列,採用slice實現,每次出隊slice就重新賦值。你可以把注釋掉的列印語句開啟,方便理解。11000
11000
00100
00011
輸出: 3
解釋: 每座島嶼只能由水平和/或豎直方向上相鄰的陸地連線而成。
除了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 解釋 該算式轉化為常見的中綴算術表示式為...