一个机器人在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
int[][] dp=new int[m][n];
for(int i=0;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];
}
} public class Solution {
public int uniquePaths(int m, int n) {
int a[][] = new int[m][n];
for(int i=0;i<m;i++)
a[i][0]=1;
for(int i=0;i<n;i++)
a[0][i]=1;
for(int i=1;i<m;i++)
for(int j=1;j<n;j++)
a[i][j] = a[i-1][j]+a[i][j-1];
return a[m-1][n-1];
}
}
class Solution {
public:
/**
*
* @param m int整型
* @param n int整型
* @return int整型
*/
int uniquePaths(int m, int n) {
vector<vector<int>> grid(m, vector<int>(n, 1));
for (int y = 1; y < m; ++y)
for (int x = 1; x < n; ++x)
grid[y][x] = grid[y - 1][x] + grid[y][x - 1];
return grid[m - 1][n - 1];
}
}; public class Solution {
public int uniquePaths(int m, int n) {
int[] count = new int[n];
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(i == 0 || j == 0)
count[j] = 1;
else
count[j] = count[j - 1] + count[j];
}
}
return count[n - 1];
}
}
/*
由题可得出递推方程
uniquePaths(i, j) = 1; if(i == 0 || j == 0)
uniquePaths(i, j) = uniquePaths(i - 1, j) + uniquePaths(i, j - 1); else
用一个一维数组存放计算过的值
其中count[j] = uniquePaths(i, j),即从起始点到第i行第j列的路径总数。
*/ class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int> > dp(m,vector<int>(n,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 {
public int uniquePaths(int m, int n) {
if(m == 1 || n == 1)
return 1;
//dp[i][j]表示机器人从点(0,0)出发到点(i,j)的不同路径数目
int dp[][]= new int[m][n];
dp[0][0] = 0;
/*考虑边缘情况*/
//n = 1的情况,只有一条直线路径
for(int i = 1; i < m; i++){
dp[i][0] = 1;
}
//m = 1的情况,只有一条直线路径
for(int j = 1; j < n; j++){
dp[0][j] = 1;
}
//动态规划
for(int i = 1; i < m; i++){
for(int j = 1; j < n; j++){
//到达点(i,j)有两种路径:
//(1)机器人从点(i-1,j)往下移动 (2)机器人从点(i,j-1)往右移动
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[m-1][n-1];
}
}
Solution 1
class Solution {
public:
int hash[102][102]={0};
int uniquePaths(int m, int n) {
if(m<=0||n<=0) return -1;
if(m==1||n==1) return 1;
if(hash[m][n]!=0) return hash[m][n];
hash[m][n]=uniquePaths(m,n-1)+uniquePaths(m-1,n);
return hash[m][n];
}
};
Solution 2
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int> >dp(m,vector<int>(n));
dp[0][0]=1;
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];
}
};
class Solution {
public:
int uniquePaths(int m, int n) {
int dp[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];
}
}; public int uniquePaths(int m, int n) {
if(m<1||n<1) return 0;
int[][] dp = new int[m+1][n+1];
//基础状态
for(int i=1;i<n+1;i++) {
dp[1][i]=1;
}
for(int i=1;i<m+1;i++) {
dp[i][1]=1;
}
//自底向上动态规划
for(int i=2;i<m+1;i++) {
for(int j=2;j<n+1;j++) {
dp[i][j] = dp[i][j-1]+dp[i-1][j];
}
}
return dp[m][n];
}
int uniquePaths(int m, int n)
{
//map<string, int> pathNum;
vector<int> line(n, 0);
vector<vector<int>> pathNum(m, line);
for (int i = 0; i < m; ++i)
{
for(int j = 0; j < n; ++j)
{
// (i,j) = (i-1) + (m-1)
if (i == 0 || j == 0)
{
pathNum[i][j] = 1;
continue;
}
int temp = pathNum[i - 1][j] + pathNum[i][j - 1];
pathNum[i][j] = temp;
}
}
return pathNum[m - 1][n - 1];
} class Solution {
public:
int uniquePaths(int m, int n) {
if(m <= 0 || n <= 0){
return 0;
}
vector<vector<int>> F(m, vector<int>(n, 1));
for(int i = 1; i < m; ++i){
for(int j = 1; j < n; ++j){
F[i][j] = F[i - 1][j] + F[i][j - 1];
}
}
return F[m - 1][n - 1];
}
}; public class Solution {
public int uniquePaths(int m, int n) {
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];
}
}
class Solution {
public:
/**
*
* @param m int整型
* @param n int整型
* @return int整型
*/
int uniquePaths(int m, int n) {
// write code here
if(m == 1 || n == 1)
return 1;
return uniquePaths(m-1, n) + uniquePaths(m, n-1);
}
};