一个机器人在m×n大小的地图的左上角(起点)。
机器人每次可以向下或向右移动。机器人要到达地图的右下角(终点)。
可以有多少种不同的路径从起点走到终点?
备注:m和n小于等于100,并保证计算结果在int范围内
数据范围:
,保证计算结果在32位整型范围内
要求:空间复杂度
,时间复杂度
进阶:空间复杂度
,时间复杂度
2,1
1
2,2
2
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param m int整型
* @param n int整型
* @return int整型
*/
public int uniquePaths (int m, int n) {
// write code here
// 算法核心思想:记忆化搜索
// dp[i][j]表示当位置落在i,j上时,有几种走法可以到达m-1,n-1
// 初始化-1
int[][] dp = new int[m][n];
for (int i = 0; i < dp.length; i++) {
for (int j = 0; j < dp[0].length; j++) {
dp[i][j] = -1;
}
}
return process(m, n, 0, 0, dp);
}
public int process (int m, int n, int i, int j, int[][] dp) {
// 递归出口
if (i == m - 1 && j == n - 1) {
dp[i][j] = 1;
return dp[i][j];
}
// 递归分支
if (dp[i][j] != -1) {
return dp[i][j];
}
// 往下走
int d = 0;
if (i < m - 1) {
// 不会越界,可以走
if (dp[i + 1][j] == -1) {
dp[i + 1][j] = process(m, n, i + 1, j, dp);
}
d = dp[i + 1][j];
}
// 往右走
int r = 0;
if (j < n - 1) {
// 不会越界,可以走
if (dp[i][j + 1] == -1) {
dp[i][j + 1] = process(m, n, i, j + 1, dp);
}
r = dp[i][j + 1];
}
// 本位置的走法,等于向右走的走法 + 向下走的走法
dp[i][j] = d + r;
return dp[i][j];
}
} public int uniquePaths (int m, int n) {
int[][] dp=new int[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i==0&&j==0){
dp[i][j]=1;
}else if(i==0){
dp[i][j]=1;
}else if(j==0){
dp[i][j]=1;
}else{
dp[i][j]=dp[i][j-1]+dp[i-1][j];
}
}
}
return dp[m-1][n-1];
} import java.util.*;
public class Solution {
/**
*
* @param m int整型
* @param n int整型
* @return int整型
*/
public int uniquePaths (int m, int n) {
// write code here
return Combination(m+n-2, m-1);
}
private static int Combination(int n, int k) {
if(k==0||k==n)
return 1;
else
return Combination(n-1, k)+Combination(n-1, k-1);
}
} import java.util.*;
public class Solution {
/**
*
* @param m int整型
* @param n int整型
* @return int整型
*/
public int uniquePaths (int m, int n) {
// write code here
if(m == 1){
return 1;
}else if(n == 1 ){
return 1;
}
return uniquePaths(m-1, n) + uniquePaths(m, n-1);
}
} public int uniquePaths (int m, int n) {
// write code here
int dp[][] = new int[m][n];
for (int i = 0; i < n; i++) {
dp[0][i] = 1;
}
for (int i = 0; i < m; i++) {
dp[i][0] = 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];
}
import java.util.*;
public class Solution {
/**
*
* @param m int整型
* @param n int整型
* @return int整型
*/
public int uniquePaths (int m, int n) {
// write code here
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) {
dp[i][0] = 1;
}
for (int i = 0; i < n; i++) {
dp[0][i] = 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];
}
} public class Solution {
/**
*
* @param m int整型
* @param n int整型
* @return int整型
*/
public int uniquePaths (int m, int n) {
// write code here
int[][] dp = new int[m][n];
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(i == 0 || j == 0){
dp[i][j] = 1;
}else{
dp[i][j] = dp[i][j-1] + dp[i-1][j];
}
}
}
return dp[m-1][n-1];
}
} import java.util.*;
public class Solution {
/**
*
* @param m int整型
* @param n int整型
* @return int整型
*/
public int uniquePaths (int m, int n) {
// write code here
if (m == 1 || n == 1) return 1;
int[][] dp = new int[m][n];
for (int i = 1; i < m; i ++) dp[i][0] = 1;
for (int i = 1; i < n; i ++) dp[0][i] = 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];
}
}