文章目录
- 力扣62.不同路径
- 题目描述
- 方法1:暴力深搜(超时未通过)
- 方法2:动态规划
力扣62.不同路径
题目描述
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:
输入:m = 3, n = 7
输出:28
示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
- 向右 -> 向下 -> 向下
- 向下 -> 向下 -> 向右
- 向下 -> 向右 -> 向下
示例 3:
输入:m = 7, n = 3
输出:28
示例 4:
输入:m = 3, n = 3
输出:6
提示:
1 <= m, n <= 100
题目数据保证答案小于等于 2 * 109
方法1:暴力深搜(超时未通过)
使用最经典的深搜dfs模板搜索全部路线,每搜索到一个路线让全局变量count++,最终返回count,但由于其指数级的时间复杂度最终导致结果超时
int count=0;
void dfs(int m,int n,int **book,int i,int j)
{
if(i==m-1&&j==n-1)
{
count++;
return;
}
if(i+1<m&&j<n&&book[i+1][j]==0)
{
book[i+1][j]=1;
dfs(m,n,book,i+1,j);
book[i+1][j]=0;
}
if(i<m&&j+1<n&&book[i][j+1]==0)
{
book[i][j+1]=1;
dfs(m,n,book,i,j+1);
book[i][j+1]=0;
}
}
int uniquePaths(int m, int n){
int **book=(int **)malloc(sizeof(int *)*m),i=0;
for(i=0;i<m;i++) book[i]=(int *)calloc(sizeof(int),n);
book[0][0]=1;
count=0;
dfs(m,n,book,0,0);
return count;
}
方法2:动态规划
思路:对于一个位置(i,j)的到达路线数,等于其正上方位置:(i-1,j)路线数加上其左边位置:(i,j-1)路线数之和。
即有状态转移方程:
d
p
[
i
]
[
j
]
=
d
p
[
i
−
1
]
[
j
]
+
d
p
[
i
]
[
j
−
1
]
dp[i][j]=dp[i-1][j]+dp[i][j-1]
dp[i][j]=dp[i−1][j]+dp[i][j−1]
开辟额外的O(mn)空间来存储每一位置的到达路线数
算法时间复杂度O(mn) 空间复杂度O(mn)
int uniquePaths(int m, int n){
int results[m][n],i,j;
for(i=0;i<m;i++) memset(results[i],0,sizeof(int)*n);
results[0][0]=1;
for(i=0;i<m;i++){
for(j=0;j<n;j++)
{
if(i-1>=0) results[i][j]+=(results[i-1][j]);
if(j-1>=0) results[i][j]+=(results[i][j-1]);
}
}
return results[m-1][n-1];
}