LeetCode Hot 热题100 算法题 64.最小路径和-算法&测试-medium模式
给定i一个包含非负整数的m×n网格grid,请找出一条从左上角到右下角的路径,是的路径上的数字总和为最小。
说明:每次只能向下或向右移动一步。
输入:grid = [ [1,3,1], [1,5,1], [4,2,1] ]
输出:7 (1->3->1->1->1)
动态规划
package leetcode.medium;
//64.最小路径和
public class Solution064 {
public static void main(String[] args) {
int[][] grid = {
{1,3,4,8},
{3,2,2,4},
{5,7,1,9},
{2,3,2,3}
};
S64MinPathSum testMinPathSum = new S64MinPathSum();
System.out.println(testMinPathSum.minPath(grid));
}
}
class S64MinPathSum{
//动态规划
//时间复杂度O(mn) 空间复杂度O(mn)
public int minPath(int[][] grid) {
//注意检验传入的数组是否符合要求
if (grid==null || grid.length==0 || grid[0].length==0) {
return 0;
}
int m=grid.length;
int n=grid[0].length;
//dp[i][j]表示从左上角[0,0]出发到[i,j]的最小路径和
int[][] dp = new int[m][n];
dp[0][0]=grid[0][0];
//第一行 到每个格子的最小路径和=到其左侧的格子的最小路径和+该格子的数据
for (int j = 1; j < m; j++) {
dp[0][j]=dp[0][j-1]+grid[0][j];
}
//第一列 到每个格子的最小路径和=到其上方的格子的最小路径和+该格子的数据
for (int i = 1; i < n; i++) {
dp[i][0]=dp[i-1][0]+grid[i][0];
}
//对其他格子(i>0,j>0) 到该格子的最小路径和=min(到其左侧格子的最小路径和,到其上方格子的最小路径和)+该格子的数据
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
dp[i][j]=Math.min(dp[i][j-1], dp[i-1][j]) + grid[i][j];
}
}
return dp[m-1][n-1];
}
}
参考:
https://leetcode-cn.com/problems/minimum-path-sum/solution/zui-xiao-lu-jing-he-by-leetcode-solution