题目
纠正题目的一点小错误,按照题意应该指的是m行n列,所以下面这个图的表述有点问题。
思路与算法
- 单纯计算的话,高中概率方面的题,排列组合知识就可以解决。
- 不依靠上述方法,根据动态规划来做:
- 方法一:从(0,0)到(m-1,n-1)只能向下或向右,即(0,0)只能到达(0,1),(1,0)。
- 方法二:从(m-1,n-1)到(0,0),倒着来,(m-1,n-1)只能是从(m-2,n-1)或者(m-1,n-2)来的。
- 以此来进行代码实现。
代码实现
方法一:
package com.immunize.leetcode.uniquePath1;
public class Solution {
public int uniquePaths(int m, int n) {
// 特殊情况:起点即终点
if (m == 1 && n == 1) {
return 1;
}
// 当前处于(1,1),终点为(m,n)
return Path(1, 1, m, n);
}
public int Path(int x, int y, int m, int n) {
// 已经处于终点
if (x >= m && y >= n) {
return 0;
}
// 处于最下面一排或者最右边一列
if (x >= m || y >= n) {
return 1;
}
// 往下走,有多少种走法
int down = Path(x, y + 1, m, n);
// 往右走,有多少种走法
int right = Path(x + 1, y, m, n);
// 从当前(x,y)出发,走到(m,n),共有多少种走法
return down + right;
}
}
方法二:
class Solution {
public int uniquePaths(int m, int n) {
int [][] res = new int[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i==0 || j==0){
res[i][j] = 1;
}
else{
res[i][j] = res[i-1][j] + res[i][j-1];
}
}
}
return res[m-1][n-1];
}
}