题目描述
给定一个由非负整数填充的m x n的二维数组,现在要从二维数组的左上角走到右下角,请找出路径上的所有数字之和最小的路径。
注意:你每次只能向下或向右移动。
import java.util.*;
public class Solution {
/**
*
* @param grid int整型二维数组
* @return int整型
*/
public int minPathSum (int[][] grid) {
// write code here
if(grid == null || grid.length == 0 || (0 == grid.length && 0 == grid[0].length)){
return 0;
}
int r = grid.length;
int c = grid[0].length;
for(int i = 1; i < r; i++){
grid[i][0] = grid[i][0] + grid[i-1][0];//--------步骤二 边界初始化
}
for(int j = 1; j < c; j++){
grid[0][j] = grid[0][j] + grid[0][j-1];
}
//---------------------------------------
for(int i = 1; i < r; i++){
for(int j = 1; j < c; j++){
grid[i][j] = grid[i][j] + Math.min(grid[i-1][j],grid[i][j-1]);//----步骤三 状态转移
}//-------------------左边 或者 上边 最小的 加上 本身值 即为新数值
}
return grid[r-1][c-1];
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
继续思考题目"Unique Paths":
如果在图中加入了一些障碍,有多少不同的路径?
分别用0和1代表空区域和障碍
例如
下图表示有一个障碍在3*3的图中央。
[ [0,0,0], [0,1,0], [0,0,0] ]
有2条不同的路径
备注:m和n不超过100.
import java.util.*;
public class Solution {
/**
*
* @param obstacleGrid int整型二维数组
* @return int整型
*/
public int uniquePathsWithObstacles (int[][] obstacleGrid) {
// write code here
if(obstacleGrid == null || obstacleGrid.length == 0 ||(obstacleGrid.length == 1 && obstacleGrid[0].length == 0)){
return 0;
}
if(obstacleGrid[0][0] == 1){//-----[0][0]有障碍 就直接返回
return 0;
}
int r = obstacleGrid.length;
int c = obstacleGrid[0].length;
int [][] res = new int[r][c];//------------定义一个数组 步骤一
for(int i = 0; i < r; i++){
if(obstacleGrid[i][0] == 1){//---------边界条件 步骤二
break;
}
res[i][0] = 1;
}
for(int j = 0; j < c; j++){
if(obstacleGrid[0][j] == 1){
break;
}
res[0][j] = 1;
}
//---------------------初始化第一行第一列 有障碍 后续路径数就是0
for(int i = 1; i < r; i++){
for(int j = 1; j < c; j++){
if(obstacleGrid[i][j] == 1){
res[i][j] = 0;//---有障碍 该点赋值为0
}else{
res[i][j] = res[i-1][j] + res[i][j-1];//-----状态转移 步骤三
}//---------只能从上或者从下移到该点
}
}
return res[r-1][c-1];
}
}