一个机器人位于一个 m x n
网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:
输入:m = 3, n = 7 输出:28
示例 2:
输入:m = 3, n = 2 输出:3 解释: 从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 3. 向下 -> 向右 -> 向下
思路:
方法一:动态规划
1.设置数组dp[m,n]来记录到达每个位置的不同路径条数
2.最顶行和最左列的每个位置能够到达的路径条数均为1 ,将dp对应位置置为1
3.到达位置[i,j]有两种可能,[i-1,j]和[i,j-1],所以dp[i,j] = dp[i-1,j]+[i,j-1]
4.遍历计算dp数组,最后返回dp[m-1,n-1]
方法二:排列组合
1.因为只能往下或者往左,那么到达最后位置,下左的次数是固定的m-1次和n-1次
2.可以对这两种步骤进行排列组合,即
// 动态规划
var uniquePaths = function(m, n) {
let dp = []
for(let i = 0;i < m;i++) dp[i,0] = 1;
for(let i = 0;i < n;i++) dp[0,i] = 1;
for(let i = 1;i < m;i++){
for(let j = 1;j < n;j++){
dp[i,j] = dp[i-1,j] + dp[i,j-1]
}
}
return dp[m-1,n-1]
};
//排列组合
var uniquePaths = function(m, n) {
let ans = 1;
for (let x = n, y = 1; y < m; ++x, ++y) {
ans = Math.floor(ans * x / y);
}
return ans;
};
时间复杂度:动态规划O(mn) 排列组合O(m)
空间复杂度:动态规划O(mn) 排列组合O(1)