fix/529: space complexity O(n)-> O(1)

This commit is contained in:
novahe
2022-03-13 01:22:13 +08:00
parent 6165466253
commit 31a02a5c40
3 changed files with 61 additions and 100 deletions

View File

@ -16,48 +16,31 @@ func updateBoard(board [][]byte, click []int) [][]byte {
board[click[0]][click[1]] = 'X' board[click[0]][click[1]] = 'X'
return board return board
} }
dfs(board, click[0], click[1])
return board
}
mineMap := make([][]int, len(board)) func dfs(board [][]byte, x, y int) {
for i := range board { cnt := 0
mineMap[i] = make([]int, len(board[i])) for i := 0; i < 8; i++ {
} nx, ny := x+dir8[i][0], y+dir8[i][1]
if isInBoard(board, nx, ny) && board[nx][ny] == 'M' {
for i := range board { cnt++
for j := range board[i] { }
if board[i][j] == 'M' { }
mineMap[i][j] = -1 if cnt > 0 {
for _, d := range dir8 { board[x][y] = byte(cnt + '0')
nx, ny := i+d[0], j+d[1] return
if isInBoard(board, nx, ny) && mineMap[nx][ny] >= 0 { }
mineMap[nx][ny]++ board[x][y] = 'B'
} for i := 0; i < 8; i++ {
} nx, ny := x+dir8[i][0], y+dir8[i][1]
} if isInBoard(board, nx, ny) && board[nx][ny] != 'B' {
dfs(board, nx, ny)
} }
} }
mineSweeper(click[0], click[1], board, mineMap, dir8)
return board
} }
func isInBoard(board [][]byte, x, y int) bool { func isInBoard(board [][]byte, x, y int) bool {
return x >= 0 && x < len(board) && y >= 0 && y < len(board[0]) return x >= 0 && x < len(board) && y >= 0 && y < len(board[0])
} }
func mineSweeper(x, y int, board [][]byte, mineMap [][]int, dir8 [][]int) {
if board[x][y] != 'M' && board[x][y] != 'E' {
return
}
if mineMap[x][y] == -1 {
board[x][y] = 'X'
} else if mineMap[x][y] > 0 {
board[x][y] = '0' + byte(mineMap[x][y])
} else {
board[x][y] = 'B'
for _, d := range dir8 {
nx, ny := x+d[0], y+d[1]
if isInBoard(board, nx, ny) && mineMap[nx][ny] >= 0 {
mineSweeper(nx, ny, board, mineMap, dir8)
}
}
}
}

View File

@ -103,43 +103,33 @@ func updateBoard(board [][]byte, click []int) [][]byte {
board[click[0]][click[1]] = 'X' board[click[0]][click[1]] = 'X'
return board return board
} }
mineMap := make([][]int, len(board)) dfs(board, click[0], click[1])
for i := range board {
mineMap[i] = make([]int, len(board[i]))
}
for i := range board {
for j := range board[i] {
if board[i][j] == 'M' {
mineMap[i][j] = -1
for _, d := range dir8 {
nx, ny := i+d[0], j+d[1]
if isInBoard(board, nx, ny) && mineMap[nx][ny] >= 0 {
mineMap[nx][ny]++
}
}
}
}
}
mineSweeper(click[0], click[1], board, mineMap, dir8)
return board return board
} }
func mineSweeper(x, y int, board [][]byte, mineMap [][]int, dir8 [][]int) { func dfs(board [][]byte, x, y int) {
if board[x][y] != 'M' && board[x][y] != 'E' { cnt := 0
for i := 0; i < 8; i++ {
nx, ny := x+dir8[i][0], y+dir8[i][1]
if isInBoard(board, nx, ny) && board[nx][ny] == 'M' {
cnt++
}
}
if cnt > 0 {
board[x][y] = byte(cnt + '0')
return return
} }
if mineMap[x][y] == -1 { board[x][y] = 'B'
board[x][y] = 'X' for i := 0; i < 8; i++ {
} else if mineMap[x][y] > 0 { nx, ny := x+dir8[i][0], y+dir8[i][1]
board[x][y] = '0' + byte(mineMap[x][y]) if isInBoard(board, nx, ny) && board[nx][ny] != 'B' {
} else { dfs(board, nx, ny)
board[x][y] = 'B'
for _, d := range dir8 {
nx, ny := x+d[0], y+d[1]
if isInBoard(board, nx, ny) && mineMap[nx][ny] >= 0 {
mineSweeper(nx, ny, board, mineMap, dir8)
}
} }
} }
} }
func isInBoard(board [][]byte, x, y int) bool {
return x >= 0 && x < len(board) && y >= 0 && y < len(board[0])
}
``` ```

View File

@ -103,47 +103,35 @@ func updateBoard(board [][]byte, click []int) [][]byte {
board[click[0]][click[1]] = 'X' board[click[0]][click[1]] = 'X'
return board return board
} }
mineMap := make([][]int, len(board)) dfs(board, click[0], click[1])
for i := range board {
mineMap[i] = make([]int, len(board[i]))
}
for i := range board {
for j := range board[i] {
if board[i][j] == 'M' {
mineMap[i][j] = -1
for _, d := range dir8 {
nx, ny := i+d[0], j+d[1]
if isInBoard(board, nx, ny) && mineMap[nx][ny] >= 0 {
mineMap[nx][ny]++
}
}
}
}
}
mineSweeper(click[0], click[1], board, mineMap, dir8)
return board return board
} }
func mineSweeper(x, y int, board [][]byte, mineMap [][]int, dir8 [][]int) { func dfs(board [][]byte, x, y int) {
if board[x][y] != 'M' && board[x][y] != 'E' { cnt := 0
for i := 0; i < 8; i++ {
nx, ny := x+dir8[i][0], y+dir8[i][1]
if isInBoard(board, nx, ny) && board[nx][ny] == 'M' {
cnt++
}
}
if cnt > 0 {
board[x][y] = byte(cnt + '0')
return return
} }
if mineMap[x][y] == -1 { board[x][y] = 'B'
board[x][y] = 'X' for i := 0; i < 8; i++ {
} else if mineMap[x][y] > 0 { nx, ny := x+dir8[i][0], y+dir8[i][1]
board[x][y] = '0' + byte(mineMap[x][y]) if isInBoard(board, nx, ny) && board[nx][ny] != 'B' {
} else { dfs(board, nx, ny)
board[x][y] = 'B'
for _, d := range dir8 {
nx, ny := x+d[0], y+d[1]
if isInBoard(board, nx, ny) && mineMap[nx][ny] >= 0 {
mineSweeper(nx, ny, board, mineMap, dir8)
}
} }
} }
} }
```
func isInBoard(board [][]byte, x, y int) bool {
return x >= 0 && x < len(board) && y >= 0 && y < len(board[0])
}
```
---------------------------------------------- ----------------------------------------------
<div style="display: flex;justify-content: space-between;align-items: center;"> <div style="display: flex;justify-content: space-between;align-items: center;">