一.不同的路径
描述
有一个机器人的位于一个 m × n 个网格左上角。
机器人每一时刻只能向下或者向右移动一步。机器人试图达到网格的右下角。
问有多少条不同的路径?
样例
Example 1:
Input: n = 1, m = 3
Output: 1
Explanation: Only one path to target position.
Example 2:
Input: n = 3, m = 3
Output: 6
Explanation:
D : Down
R : Right
1) DDRR
2) DRDR
3) DRRD
4) RRDD
5) RDRD
6) RDDR
注意事项
n和m均不超过100
代码部分
public class Solution {
/**
* @param m: positive integer (1 <= m <= 100)
* @param n: positive integer (1 <= n <= 100)
* @return: An integer
*/
public int uniquePaths(int m, int n) {
// write your code here
int[][] dp=new int[m][n];
//dp[1][0]=1;
//dp[0][1]=1;
for(int k=0;k<m;k++){
dp[k][0]=1;
}
for(int k=0;k<n;k++){
dp[0][k]=1;
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
return dp[m-1][n-1];
}
}
二.不同的路径II
描述
"不同的路径" 的跟进问题:
现在考虑网格中有障碍物,那样将会有多少条不同的路径?
网格中的障碍和空位置分别用 1 和 0 来表示。
样例
Example 1:
Input: [[0]]
Output: 1
Example 2:
Input: [[0,0,0],[0,1,0],[0,0,0]]
Output: 2
Explanation:
Only 2 different path.
注意事项
m 和 n 均不超过100
代码部分
public class Solution {
/**
* @param obstacleGrid: A list of lists of integers
* @return: An integer
*/
public int min(int a,int b){
return a>b?b:a;
}
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
// write your code here
int m=obstacleGrid.length;//行数
int n=obstacleGrid[0].length;//列数
if(m==0||n==0){
return 0;
}
if(m==1){
//return 1;
//boolean flag=Arrays.asList(obstacleGrid[0]).contains(1);
for(int l=0;l<n;l++){
if(obstacleGrid[0][l]==1){
return 0;
}
}
//if(flag){
// return 0;
//}
//else{
// return 1;
//}
return 1;
}
if(n==1){
for(int l=0;l<m;l++){
if(obstacleGrid[l][0]==1){
return 0;
}
}
return 1;
}
if(obstacleGrid[0][0]==1){
return 0;
}
int tempm=100;
int tempn=100;
int dp[][]=new int[m][n];
for(int k=1;k<m;k++){//第一列
dp[k][0]=1;
if(obstacleGrid[k][0]==1){
tempm=min(tempm,k);
}
}
if(tempm<100){
for(int k=tempm;k<m;k++){
dp[k][0]=0;
}
}
for(int k=1;k<n;k++){//第一行
dp[0][k]=1;
if(obstacleGrid[0][k]==1){
tempn=min(tempn,k);
}
}
if(tempn<100){
for(int k=tempn;k<n;k++){
dp[0][k]=0;
}
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(obstacleGrid[i][j]==1){
dp[i][j]=0;
}else{
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
}
补充说明
若整个二维矩阵中全是0,则dp[i][j]=dp[i-1][j]+dp[i][j-1];若矩阵中的1在边界,则从这个点往下的第一行或第一列dp[i][j]都等于0;若矩阵中的1不在边界,则只是这个点的dp[i][j]=0。