leetCode-Minimum Path Sum

来源:互联网 发布:线切割编程软件有几种 编辑:程序博客网 时间:2024/06/03 18:15

Description:
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

Note: You can only move either down or right at any point in time.

Example 1:

[[1,3,1], [1,5,1], [4,2,1]]

Given the above grid map, return 7. Because the path 1→3→1→1→1 minimizes the sum.

典型的动态规划问题,我用了两种解决方法。

方法一:

//“就地”修改grid。存储dp矩阵。dp[i][j] = grid[i][j] + min(dp[i + 1][j],dp[i][j + 1])。由于第m行和第n列只能往右走或往下走,因此用两个for循环初始化了m行,n列的dp数组。然后迭代存储dp[i][j]即可,dp[0][0]即为最短路径。class Solution {    public int minPathSum(int[][] grid) {        int m = grid.length;        int n = grid[0].length;        for(int i = n - 2;i >= 0;i--){            grid[m - 1][i] += grid[m - 1][i + 1];        }        for(int i = m - 2;i >= 0;i--){            grid[i][n - 1] += grid[i + 1][n - 1];        }        for(int i = m - 2;i >= 0;i--){            for(int j = n - 2;j >= 0;j--){                grid[i][j] = grid[i][j] + Math.min(grid[i + 1][j],grid[i][j + 1]);            }        }        return grid[0][0];    }}

方法2:

//将二维dp数组缩减到1维,减少空间复杂度class Solution {    public int minPathSum(int[][] grid) {        int m = grid.length;        int n = grid[0].length;        int[] sum = new int[n];        for(int i = m - 1;i >= 0;i--){            sum[n - 1] += grid[i][n - 1];             if(i == m - 1){                    for(int j = n - 2;j >= 0;j--){                        sum[j] = sum[j + 1] + grid[i][j];                    }             }else{                    for(int j = n - 2;j >= 0;j--){                        sum[j] = grid[i][j] + Math.min(sum[j],sum[j + 1]);                    }                 }        }        return sum[0];    }}