每日一题:64. 最小路径和

74 阅读1分钟

package com.ljp.test.leetcode;

/**

  • 64. 最小路径和

  • 给定一个包含非负整数的 mxn 网格grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

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

  • 示例 1:

  • 输入:grid = [[1,3,1],[1,5,1],[4,2,1]]

  • 输出:7

  • 解释:因为路径 1→3→1→1→1 的总和最小。

  • 示例 2:

  • 输入:grid = [[1,2,3],[4,5,6]]

  • 输出:12

  • 提示:

  • m == grid.length

  • n == grid[i].length

  • 1 <= m, n <= 200

  • 0 <= grid[i][j] <= 100

  • 来源:力扣(LeetCode)

  • 链接:64. 最小路径和

  • 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • @author luojunping

  • @since 2023-03-09 */ public class Number0064 {

    public static void main(String[] args) { int[][] nums1 = {{1, 3, 1}, {1, 5, 1}, {4, 2, 1}}; int[][] nums2 = {{1, 2, 3}, {4, 5, 6}}; System.out.println(DynamicPlanning.minPathSum(nums1)); System.out.println(DynamicPlanning.minPathSum(nums2)); }

    /**

    • 动态规划 */ private static class DynamicPlanning {

      public static int minPathSum(int[][] nums) { int m = nums.length; int n = nums[0].length; int[][] dp = new int[m][n]; dp[0][0] = nums[0][0]; for (int i = 1; i < m; i++) { dp[i][0] = dp[i - 1][0] + nums[i][0]; } for (int i = 1; i < n; i++) { dp[0][i] = dp[0][i - 1] + nums[0][i]; } for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) { int minimum = Math.min(dp[i - 1][j], dp[i][j - 1]); dp[i][j] = minimum + nums[i][j]; } } return dp[m - 1][n - 1]; }

    }

}