5

LeetCode-064-最小路径和

 3 years ago
source link: https://segmentfault.com/a/1190000040903243
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

LeetCode-064-最小路径和

发布于 11 月 3 日

最小路径和

题目描述:给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例说明请见LeetCode官网。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl...
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:穷举法 递归

递归方法minPathSum的参数为当前的坐标和当前的路径和,递归过程如下:

  • 如果当前坐标已经是走到右下角了,判断当前的路径和是否比已有的最小值小,如果是,则更新最小值;
  • 如果当前坐标走到最右边了,则坐标往下移,递归处理;
  • 如果当前坐标走到最下边了,则坐标往右移,递归处理;
  • 如果当前坐标不在边上,则需要递归2次分别往下移和往右移。

最后,返回最小值。

解法二:动态规划
  • 首先,声明一个和grid同样大小的二维数组dp用来存储到达相应单元格的累加值;
  • 初始化第一列的值;
  • 初始化第一行的值;
  • 然后遍历后面的单元格,取左边和上边较小的值赋值;
  • 最后返回dp[rows - 1][columns - 1]即为最小的和。
public class LeetCode_064 {
    private static int result = Integer.MAX_VALUE;

    /**
     * 穷举法 递归
     *
     * @param grid
     * @return
     */
    public static int minPathSum(int[][] grid) {
        minPathSum(grid, 0, 0, 0);
        return result;
    }

    private static void minPathSum(int[][] grid, int x, int y, int sum) {
        sum += grid[x][y];
        // 走到右下角的单元格
        if (x == grid.length - 1 && y == grid[0].length - 1) {
            result = Math.min(sum, result);
            return;
        }
        if (x == grid.length - 1) {
            // 走到最后一行,往右走
            minPathSum(grid, x, y + 1, sum);
        } else if (y == grid[0].length - 1) {
            // 走到最后一列,往下走
            minPathSum(grid, x + 1, y, sum);
        } else {
            // 往下走
            minPathSum(grid, x, y + 1, sum);
            // 往右走
            minPathSum(grid, x + 1, y, sum);
        }
    }

    /**
     * 动态规划
     *
     * @param grid
     * @return
     */
    public static int minPathSum2(int[][] grid) {
        if (grid == null || grid.length == 0 || grid[0].length == 0) {
            return 0;
        }
        int rows = grid.length, columns = grid[0].length;
        int[][] dp = new int[rows][columns];
        dp[0][0] = grid[0][0];
        /**
         * 初始化第一列的值
         */
        for (int i = 1; i < rows; i++) {
            dp[i][0] = dp[i - 1][0] + grid[i][0];
        }

        /**
         * 初始化第一行的值
         */
        for (int j = 1; j < columns; j++) {
            dp[0][j] = dp[0][j - 1] + grid[0][j];
        }
        /**
         * 当前的单元格取较小值
         */
        for (int i = 1; i < rows; i++) {
            for (int j = 1; j < columns; j++) {
                dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
            }
        }
        return dp[rows - 1][columns - 1];
    }

    public static void main(String[] args) {
        int[][] grid = new int[][]{{1, 3, 1}, {1, 5, 1}, {4, 2, 1}};
        System.out.println(minPathSum(grid));
        System.out.println(minPathSum2(grid));
    }
}

【每日寄语】 穷人缺什么:表面缺资金,本质缺野心,脑子缺观念,机会缺了解,骨子缺勇气,改变缺行动,事业缺毅力。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK