题目
分析
dp【i】【j】代表从(0,0)出发走到(i,j)位置上有多少种路径。关于dp数组的初始化,由于机器人每次只能向右或者向下移动一步。所以第 0 行和第 0 列dp数组初始化为 1。动态转移方程:
dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。遍历顺序,从左上到右下。
代码
1 class Solution { 2 public: 3 int uniquePaths(int m, int n) { 4 vector<vector<int>>dp(m,vector<int>(n,0)); 5 for(int i = 0;i < n;i++) dp[0][i] = 1; 6 for(int i = 0;i < m;i++) dp[i][0] = 1; 7 for(int i = 1;i < m;i++){ 8 for(int j = 1;j < n;j++){ 9 dp[i][j] = dp[i-1][j] + dp[i][j-1]; //动态转移方程 10 } 11 } 12 return dp[m-1][n-1]; 13 } 14 };
时间复杂度为O(m * n) ,空间复杂度O(m * n)
注意上面的dp数组可以优化为一维数组,这里不展开,以后总结下滚动数组的思想。
分析
直接按照图的深搜,但是时间会超时
代码
1 class Solution { 2 public: 3 int dfs(int i ,int j ,int m,int n){ 4 if(i > m || j > n) return 0; //越界 5 if(i == m && j == n) return 1; //走到终点 6 return dfs(i+1,j,m,n) + dfs(i,j+1,m,n); 7 } 8 int uniquePaths(int m, int n) { 9 return dfs(0,0,m-1,n-1); //也可从(1,1)到(m,n) 10 } 11 };
指数级的时间复杂度。