一个机器人在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]; } }
0 | 1 | 1 | 1 | 1 |
1 | 2 | 3 | 4 | 5 |
1 | 3 | 6 | 10 | 15 |
1 | 4 | 10 | 20 | 35 |
# # # @param m int整型 # @param n int整型 # @return int整型 # class Solution: def uniquePaths(self , m , n ): # write code here # 迭代法 if m==0&nbs***bsp;n==0: return 0 if m==1&nbs***bsp;n==1: return 1 data = [[1]*m for i in range(n)] for i in range(1,n): for j in range(1,m): data[i][j] = data[i][j-1] + data[i-1][j] return data[n-1][m-1] # 递归法 超时 # if m==0&nbs***bsp;n==0: # return 0 # if m==1&nbs***bsp;n==1: # return 1 # return self.uniquePaths(m-1,n)+self.uniquePaths(m,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]; } }