题目:给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
解题思路:
(1)由于路线只向下或者右走,所以在最上面的一排,和最左边的一排只有维一条路径可走。
(2)我们可以首先将最上面和最左边的所有到这个点的长度先算出来,然后用一个相同大小的二维数组temp保存下来。
(3)最后通过一个双重循环,此时只需从数组的[1][1]开始,通过比较这个点和左,上两点的和,选出最小的距离长度。最后只需要返回temp数组的最后一个值,即可知道到这个点的最小距离。(因为之前的算法中数组temp存的都是到这个点的最小距离)
class Solution {
public int minPathSum(int[][] grid) {
int m = grid.length;//得到数组的行
int n = grid[0].length;//得到数组的列
int temp[][] = new int[m][n];//定义一个二维数组原来保存初始点到这个点的最小长度
temp[0][0] = grid[0][0];//到初始点的距离就是源数组的第一个值
for(int i=1;i<n;i++){
temp[0][i] = temp[0][i-1]+grid[0][i];//将最左边的一列先初始化
}
for(int i=1;i<m;i++){
temp[i][0] = temp[i-1][0]+grid[i][0];//将最上边的一列先初始化
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
temp[i][j]=(grid[i][j]+temp[i-1][j])>(grid[i][j]+temp[i][j-1]) ? grid[i][j]+temp[i][j-1]:grid[i][j]+temp[i-1][j];//通过比较这个点和左,上两点的和,选出最小的距离长度
}
}
return temp[m-1][n-1];//返回最后一个值
}
}