LeetCode《不同路径》的解题思考过程
Posted adventure.Li
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode《不同路径》的解题思考过程相关的知识,希望对你有一定的参考价值。
一、题目描述
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
二、解决办法
- 从数学角度
拿到此题,可能不少朋友会想起来高中学习组合数学时做过,本人也是第一反应直接进行组合数计算不是很快,基本上只需要0ms解决问题,但由于细节问题,分析失误导致结果不对,然后开始了其他思路。
数学功底较差或者没敢去想的朋友也别慌,还可以进行以下策略。
- 暴力办法 进行搜索DFS
// int res =0;
// void dfs(int row,int col,int m,int n){// 1,1开始
// if(row==m&&col==n){
// res++;
// return;
// }
// if(row>m||col>n||row<1||col<1){
// return;
// }
// dfs(row+1,col,m,n);
// dfs(row,col+1,m,n);
// // dfs(row-1,col,m,n);
// // dfs(row,col-1,m,n);
// }
很遗憾,只能通过41个用例,超时了,接着来第三种办法
- 递归
很容易发现这样一个简单的递归关系,你有两种办法一种是向下另外一种是向右也就得到这样一个递推式 recursion(m,n) =
recursion(m-1,n)+recursion(m,n-1) ,可以联系爬楼梯一样的想法。
// if(n==1||m==1){
// return 1;
// }
// return uniquePaths(n-1,m)+uniquePaths(n,m-1);
但效果和DFS效果一样,于是可以思考记忆优化,于是进行了记忆优化后,解决问题,虽然时间复杂度比较低。
if(n==1||m==1){
cache[m][n] =1;
return 1;
}else {
// 二维数组存储
int chioce1=0,chioce2=0;
if(cache[m-1][n]!=0){
chioce1=cache[m-1][n];
}
else
{
chioce1 = uniquePaths(m-1,n);
cache[m-1][n] = chioce1;
}
if(cache[m][n-1]!=0){
chioce2=cache[m][n-1];
}
else{
chioce2 = uniquePaths(m,n-1);
cache[m][n-1] = chioce2;
}
return chioce1+chioce2;
}
- DP
采用DP方程记录递推式,其实就是采用递归思想完成,结果时间复杂度和递归记忆优化差不多的。
/*
1 1 1 1 1 1 1 1
1 2 3 4 5 6 7 8
1 3 6 10 15 21 28 36
*/
int [][]dp = new int[m][n];
Arrays.fill(dp[0],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][j-1]+dp[i-1][j];
}
}
return dp[m-1][n-1];
以上是关于LeetCode《不同路径》的解题思考过程的主要内容,如果未能解决你的问题,请参考以下文章