64. 最小路径和
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
这道题其实很简单,是我一开始用惯性思维想复杂了...
思路就是通过动态规划先得出每一步之后现在位置上的和,这个和是之前走的位置上数字的所有和加上现在位置上的数字。
至于怎么判断下一步是走右边还是走下边,那么就得每走一步,都要判断该位置右边和下边的数哪个小,然后走小的那个。
那么边界问题怎么解决呢?一共有四种情况
首先一个就是如果现在的位置有左边界,那么上一个位置只能从上面来,
即为当i !- 0 j = 0 时 dp[i][j] = dp[i-1][j] + dp[i][j];
如果现在的位置有上边界,那么上一个位置只能从左边来,
即为当i = 0 j != 0 时 dp[i][j] = dp[i][j-1] + dp[i][j];
如果现在的位置既没有左边的边界,也没有上边的边界时,
即为当i !- 0 j != 0 时 dp[i][j] = dp[i][j] + math.min(dp[i-1][j], dp[i][j-1]);
最后一种情况显而易见,不做讨论
下面 源代码如下:
很简单 也容易理解
class Solution {
public int minPathSum(int[][] grid) {
for(int i = 0; i < grid.length; i++) {
for(int j = 0; j < grid[0].length; j++) {
if(i == 0 && j == 0) continue;
else if(i == 0) grid[i][j] = grid[i][j - 1] + grid[i][j];
else if(j == 0) grid[i][j] = grid[i - 1][j] + grid[i][j];
else grid[i][j] = Math.min(grid[i - 1][j], grid[i][j - 1]) + grid[i][j];
}
}
return grid[grid.length - 1][grid[0].length - 1];
}
}
网友评论