最小门路和

题目形容:给定一个蕴含非负整数的 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));    }}
【每日寄语】 富人缺什么:外表缺资金,实质缺野心,脑子缺观点,机会缺理解,骨子缺勇气,扭转缺口头,事业缺毅力。