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]; } }