直观的思路是递归,但是,你会发现,有很多重复的计算。最终的程序超时。
public class Solution {
public int minPathSum ( int [ ] [ ] grid) {
return method ( grid, 0 , 0 , grid. length- 1 , grid[ 0 ] . length- 1 ) ;
}
private int method ( int [ ] [ ] grid, int i, int j, int row, int column) {
if ( i == row && j == column) {
return grid[ i] [ j] ;
}
if ( i== row) {
return grid[ i] [ j] + method ( grid, i, j+ 1 , row, column) ;
}
if ( j== column) {
return grid[ i] [ j] + method ( grid, i+ 1 , j, row, column) ;
}
return grid[ i] [ j] + Math. min ( method ( grid, i+ 1 , j, row, column) , method ( grid, i, j+ 1 , row, column) ) ;
}
}
所以应该采用动态规划的方式。徐徐图之。
public class Solution {
public int minPathSum ( int [ ] [ ] grid) {
int row = grid. length;
int column = grid[ 0 ] . length;
for ( int i = 1 ; i < column; i++ ) {
grid[ 0 ] [ i] += grid[ 0 ] [ i- 1 ] ;
}
for ( int i = 1 ; i < row; i++ ) {
grid[ i] [ 0 ] += grid[ i- 1 ] [ 0 ] ;
}
for ( int i = 1 ; i < row; i++ ) {
for ( int j = 1 ; j < column; j++ ) {
grid[ i] [ j] += Math. min ( grid[ i- 1 ] [ j] , grid[ i] [ j- 1 ] ) ;
}
}
return grid[ row- 1 ] [ column- 1 ] ;
}
}