题目原型:
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.
基本思路:
这是一道动态规划题,从图中可以看出,我们每次从右上角斜向下走来更新第n层的值,借助此数组更新数据,直到最后退出。
public int minPathSum(int[][] grid)
{
int lenOfRow = grid.length;
int lenOfCol = grid[0].length;
if (grid == null || lenOfRow == 0)
return 0;
int row = 0;
int col = 0;
int startRow = 0;
int startCol = 0;
while (true)
{
//如果起始点没达到最后一列
if(startCol+1<lenOfCol)
startCol+=1;
//如果起始点没达到最后一行
else if(startRow+1<lenOfRow)
startRow+=1;
//如果达到最后一行和一列,即终点,则退出
else
break;
row = startRow;
col = startCol;
//一般情况下,每次保证节点沿着左下方运行
while(row<lenOfRow&&col>=0)
{
//假如在第一行,则此节点的值只能由次行中的前一个节点决定
if(row==0)
grid[row][col] = grid[row][col]+grid[row][col-1];
//如果在最后一列,则次节点的值只能由此列的前一个元素决定
else if(col==0)
grid[row][col] = grid[row][col]+grid[row-1][col];
//否则,由此节点的前一行和前一列共同决定
else
grid[row][col] = (grid[row-1][col]<grid[row][col-1]?grid[row-1][col]:grid[row][col-1])+grid[row][col];
row++;
col--;
}
}
return grid[lenOfRow-1][lenOfCol-1];
}