1. 程式人生 > 其它 >Leecode no.64 最小路徑和

Leecode no.64 最小路徑和

package leecode;


/**
*
* 64. 最小路徑和
*
* 給定一個包含非負整數的 m x n 網格 grid ,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。
*
* 說明:每次只能向下或者向右移動一步。
*
*
* @author Tang
* @date 2021/9/7
*/
public class MinPathSum {


/**
* 動態規劃解決二維陣列問題
* 老規矩
* x :每一個元素
* f(x) :從起始位置到該元素的最小路徑值
* f(x) = MAX( f(y), f(z) )+1 y為x左邊元素,z為x上邊元素
*
* @param grid
* @return
*/
public int minPathSum(int[][] grid) {
if(grid.length == 0) {
return 0;
}
int down = grid.length;
int right = grid[down-1].length;

//構建備忘錄
int[][] tables = new int[down][right];

/**
* 優先按列處理
*/
for(int i = 0; i < down; i++) {
for(int j = 0; j < right; j++) {
if(i == 0 && j == 0){
tables[i][j] = grid[i][j];
continue;
}

if(i == 0) {
tables[i][j] = tables[i][j-1] + grid[i][j];
continue;
}
if(j == 0) {
tables[i][j] = tables[i-1][j] + grid[i][j];
continue;
}
tables[i][j] = Math.min(tables[i-1][j], tables[i][j-1]) + grid[i][j];
}
}


return tables[down-1][right-1];
}

public static void main(String[] args) {
int[][] nums= {{1,2,3},{4,5,6}};
System.out.println(new MinPathSum().minPathSum(nums));

}

}