LeetCode62. 不同路径

题目

分析

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 };

指数级的时间复杂度。

posted @ 2021-02-07 21:22  Uitachi  阅读(48)  评论(0编辑  收藏  举报