Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
Example:
Input:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
Output: 7
Explanation: Because the path 1→3→1→1→1 minimizes the sum.
题意:给出一个二维数组,找出二维数组中从(0,0)到(m,n)的某条路径(只能向右或向下移动),使累计的和最小。
思路:第一行向右遍历,所在位置的累计和=当前的值+相邻左边的累计值;
第一列向下遍历,所在位置的累计和=当前的值+相邻上边的累计值;
从第二行第二列开始,所在位置的累计和=当前的值+(相邻左边的累计值与相邻上边的累计值的最小值)。
方法:1.使用递归函数,提交显示超时。
2.使用动态规划,程序运行时间2ms,空间占用43.1M。
代码:
class Solution {
public int minPathSum(int[][] grid) {
int sum =0;
int row = grid.length;
int col=0;
if(row>0)
col= grid[0].length;
if(row ==0 || col==0)
return 0;
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
if(i==0 && j==0) //(0,0)不处理
continue;
if(i==0) //第一行,累加相邻左边的值
{
grid[i][j]+=grid[i][j-1];
continue;
}
if(j==0) //第一列,累加相邻上方的值
{
grid[i][j]+=grid[i-1][j];
continue;
}
//其他位置,用当前值加上左边与上边的最小值
grid[i][j]+=grid[i][j-1]<grid[i-1][j]?grid[i][j-1]:grid[i-1][j];
}
}
return grid[row-1][col-1];
}
}
优化代码:只需要两个一维数组记录当前行与上一行的值,而不是操作整个二维数组。