01 矩阵
试题地址:https://leetcode-cn.com/problems/01-matrix/
试题思路:
1、0本身步数就为0
2、本题是一个图类问题,所以必须使用正向dp(从0,0到n-1,m-1)和反向dp(从n-1,m-1到0,0),正向dp能够保证每个0到后面的每个1的步数是最小的,反向dp能够保证后面的0到前面的1的步数是最小的

试题代码:
package main import "fmt" func main() { matrix := [][]int{{0, 0, 1, 1}, {1, 1, 1, 1}, {1, 1, 0, 1}, {1, 1, 0, 1}} fmt.Println(updateMatrix(matrix)) } //试题地址:https://leetcode-cn.com/problems/01-matrix/submissions/ func updateMatrix(matrix [][]int) [][]int { n := len(matrix) m := len(matrix[0]) //初始化为最长路径 matrixLen := [][]int{} for i := 0; i < n; i++ { temp := []int{} for j := 0; j < m; j++ { temp = append(temp, m+n) } matrixLen = append(matrixLen, temp) } //正向 for i := 0; i < n; i++ { for j := 0; j < m; j++ { if matrix[i][j] == 0 { matrixLen[i][j] = 0 continue } if i == 0 && j == 0 { continue } if i != 0 && j == 0 { matrixLen[i][j] = min(matrixLen[i][j], matrixLen[i-1][j]+1) continue } if j != 0 && i == 0 { matrixLen[i][j] = min(matrixLen[i][j], matrixLen[i][j-1]+1) continue } matrixLen[i][j] = min(matrixLen[i][j], min(matrixLen[i-1][j]+1, matrixLen[i][j-1]+1)) } } //反向 for i := n - 1; i >= 0; i-- { for j := m - 1; j >= 0; j-- { if matrix[i][j] == 0 { matrixLen[i][j] = 0 continue } if i == n-1 && j == m-1 { continue } if i != n-1 && j == m-1 { matrixLen[i][j] = min(matrixLen[i][j], matrixLen[i+1][j]+1) continue } if j != m-1 && i == n-1 { matrixLen[i][j] = min(matrixLen[i][j], matrixLen[i][j+1]+1) continue } matrixLen[i][j] = min(matrixLen[i][j], min(matrixLen[i+1][j]+1, matrixLen[i][j+1]+1)) } } return matrixLen } func min(i, j int) int { if i > j { return j } return i }

浙公网安备 33010602011771号