首页 > 其他分享 >剑指offer99:最小路径之和

剑指offer99:最小路径之和

时间:2022-12-13 11:34:04浏览次数:36  
标签:offer99 int 路径 最小 ++ length grid public dp


题目:

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

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

示例一:

剑指offer99:最小路径之和_leetcode


输入: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

分析:

该题思路与98题类似,具体不再赘述,找到状态转移方程就可轻松解题。

状态转移方程f(i,j)等于f(i-1,j)与f(i,j-1)的最小值加上grid[i][j].

代码:

public class MinPathSum {
public static void main(String[] args) {
int[][] grid = {{1,3,1},{1,5,1}};
System.out.println(grid.length);
System.out.println(grid[0].length);
}
public int minPathSum1(int[][] grid) {
int[][] dp = new int[grid.length][grid[0].length];
dp[0][0] = grid[0][0];
for (int j = 1; j < grid[0].length; j++) {
dp[0][j] = dp[0][j-1] + grid[0][j];
}
for (int i = 1; i < grid.length; i++) {
dp[i][0] = dp[i-1][0] + grid[i][0];
for (int j = 1; j < grid[0].length; j++) {
int prev = Math.min(dp[i][j-1],dp[i-1][j]);
dp[i][j] = grid[i][j]+prev;
}
}
return grid[grid.length-1][grid[0].length-1];
}
// 优化空间效率,只需要一个一维数组dp
public int minPathSum3(int[][] grid){
int[] dp = new int[grid[0].length];
dp[0] = grid[0][0];
for (int j = 1; j < grid[0].length; j++) {
dp[j] = dp[j-1] + grid[0][j];
}
for (int i = 1; i < grid.length; i++) {
dp[0] += grid[i][0];
for (int j = 1; j < grid[0].length; j++) {
dp[j] = Math.min(dp[j-1],dp[j])+grid[i][j];
}
}
return dp[grid[0].length-1];
}
}

剑指offer99:最小路径之和_算法_02


标签:offer99,int,路径,最小,++,length,grid,public,dp
From: https://blog.51cto.com/u_15911055/5933492

相关文章