mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-07 01:44:56 +08:00
fix/529: space complexity O(n)-> O(1)
This commit is contained in:
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -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])
|
||||||
|
}
|
||||||
```
|
```
|
@ -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;">
|
||||||
|
Reference in New Issue
Block a user