0%

LeetCode.最小路径和

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。

  • 示例 1:
    输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
    输出:7

  • 示例 2:
    输入:grid = [[1,2,3],[4,5,6]]
    输出:12

    动态规划解法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    object MinPathSum {
    def main(args: Array[String]): Unit = {
    println(minPathSum(
    Array[Array[Int]](
    Array(1, 3, 1),
    Array(1, 5, 1),
    Array(4, 2, 1)
    )))

    println(minPathSum(
    Array[Array[Int]](
    Array(1)
    )))

    println(minPathSum(
    Array[Array[Int]](
    Array(1, 2)
    )))

    println(minPathSum(
    Array[Array[Int]](
    Array(2),
    Array(1)
    )))
    }

    def minPathSum(grid: Array[Array[Int]]): Int = {
    val m = grid.length
    val n = grid(0).length
    val dp = new Array[Array[Int]](m)
    for (i <- 0 until m) {
    dp(i) = new Array[Int](n)
    }

    dp(0)(0) = grid(0)(0)

    for (i <- 1 until m) {
    dp(i)(0) = dp(i - 1)(0) + grid(i)(0)
    }

    for (i <- 1 until n) {
    dp(0)(i) = dp(0)(i - 1) + grid(0)(i)
    }

    for (i <- 1 until m) {
    for (j <- 1 until n) {
    dp(i)(j) = Math.min(dp(i - 1)(j), dp(i)(j - 1)) + grid(i)(j)
    }
    }

    dp(m - 1)(n - 1)
    }
    }