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.
第一反应是一个DP的题,有一个递归的解法思路:
如果要算座标为[ i ][ j ]的最小值,那么应该是到座标[ i-1 ][ j ]的最小值和到座标[ i ][ j-1 ]的最小值中比较小的一个再加上[ i ][ j ]本身的值。如果直接这么实现,会有time limit exceed的错误,原因是有些点会被重复算到,比如算[ i ][ j-1 ]和[ i-1 ][ j ]都会去算[ i-1 ][ j-1 ]的值,于是用一个hash表来存储中间结果,结果通过了。
但是这道题可以更简单:
考虑在边上的点是只有一种情况的,就不需要取最小值,于是可以先把上面和左侧边上的值都算出来,然后再用一个两重循环,算出剩下所有的点的值,这样就节省了递归的开销。
public class Solution { public int minPathSum(int[][] grid) { if(grid==null){ return 0; } int i=grid.length; int j=grid[0].length; for(int k=1;k<i;k++){ grid[k][0] += grid[k-1][0]; } for(int k=1;k<j;k++){ grid[0][k] += grid[0][k-1]; } int top,left,val; for(int m=1;m<i;m++){ for(int n=1;n<j;n++){ top = grid[m-1][n]; left = grid[m][n-1]; val = top>left?left:top; grid[m][n]+=val; } } return grid[i-1][j-1]; } }