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
}
View Code

 

posted @ 2020-04-15 16:35  ybf&yyj  阅读(278)  评论(0)    收藏  举报