64. 最小路径和

Problem: 64. 最小路径和

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
这是一个典型的二维动态规划问题。我们可以定义一个二维数组dp,其中dp[i][j]表示从左上角到位置(i, j)的最小路径和。对于dp中的任意元素,由于只能向右和向下移动,所以dp[i][j]只能从dp[i-1][j]或者dp[i][j-1]移动而来,我们选择这两个位置的最小值,再加上当前位置的值,就是dp[i][j]的值了。

解题方法

1.初始化dp数组,dp[0][0]就是起点,是grid[0][0],dp[i][0]和dp[0][j]分别表示的是第0列和第0行,所以也可以初始化出来。
2.对于其他位置,dp[i][j]应该是dp[i-1][j]和dp[i][j-1]中的最小值加上当前位置的值,这样就可以保证dp[i][j]是到当前位置的最小路径和。
3.最后返回dp[n-1][m-1]即可,因为它表示的是从左上角到右下角的最小路径和。

复杂度

时间复杂度:

O ( n ∗ m ) O(n*m) O(nm), 需要遍历一遍二维数组

空间复杂度:

O ( n ∗ m ) O(n*m) O(nm), 需要额外的dp数组

Code

class Solution {
    public int minPathSum(int[][] grid) {
        int n = grid.length;
        int m = grid[0].length;
        int[] dp = new int[m];
        dp[0] = grid[0][0];
        // 计算出第一行的结果
        for (int i = 1; i < m; i++) {
            dp[i] = dp[i - 1] + grid[0][i];
        }
        // 滚动更新下一行的结果
        for (int i = 1; i < n; i++) {
            dp[0] += grid[i][0];
            for (int j = 1; j < m; j++) {
                dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];
            }
        }
        return dp[m - 1];
    }
}

你可能感兴趣的:(刷题,算法,leetcode,算法,动态规划)