055_岛屿数量
知识点:DFS、BFS
LeetCode第两百题:https://leetcode-cn.com/problems/number-of-islands/submissions/
BFS超时,怎么回事儿?目测是因为队列在扩容过程中存在复制,比较耗时?一样都是搜索,为啥DFS不会超时。而且还是双百?
语言:GoLang
var directs = [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}
func numIslands(grid [][]byte) int {
rowLen := len(grid)
if rowLen == 0 {
return 0
}
colLen := len(grid[0])
count := 0
for i := 0; i < rowLen; i++ {
for j := 0; j < colLen; j++ {
if grid[i][j] == '1' {
dfs(grid, i, j, rowLen, colLen)
count++
}
}
}
return count
}
// 一样都是搜索,为啥这个不会超时。而且还是双百?
func dfs(grid [][]byte, x, y, rowLen, colLen int) {
grid[x][y] = '0'
for _, direct := range directs {
newX, newY := x + direct[0], y + direct[1]
if newX < 0 || newX >= rowLen || newY < 0 || newY >= colLen {
continue
}
if grid[newX][newY] == '1' {
dfs(grid, newX, newY, rowLen, colLen)
}
}
}
// 超时,怎么回事儿?目测是因为队列在扩容过程中存在复制,比较耗时?
func bfs(grid [][]byte, x, y, rowLen, colLen int) {
q := [][]int{{x, y}}
for len(q) > 0 {
s := len(q)
for i := 0; i < s; i++ {
c := q[0]
q = q[1:]
grid[c[0]][c[1]] = '0'
for _, direct := range directs {
newX, newY := c[0] + direct[0], c[1] + direct[1]
if newX < 0 || newX >= rowLen || newY < 0 || newY >= colLen {
continue
}
if grid[newX][newY] == '1' {
q = append(q, []int{newX, newY})
}
}
}
}
}

浙公网安备 33010602011771号