题目
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
例如,上图是一个7 x 3 的网格。有多少可能的路径?
说明:m 和 n 的值均不超过 100。
示例1
输入: m = 3, n = 2
输出: 3
解释: 从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右
示例2
输入: m = 7, n = 3
输出: 28
分析
这道题动态规划很好理解
对于我们到达的任意第(x, y)
个格子,要么来自(x-1, y)
,要么来自(x, y - 1)
,我们将来自它们的路径之和相加,即为到达第(x, y)
个格子的路径数目
那么我们应该怎么实现呢?
我们使用一个一维数组L
来存放到第i
行每个格子的路径数量,不断的更新该数组
因为对于第1行的所有格子,都只能从左向右到达,因此路径数目均只有1条,L
的初始值全部为1
从第2行开始,对于每行的第1个格子,只能从上向下到达,路径数目只为1
当我们计算到第(x, y)
格子
L[y-1]
中存放的为到达第(x, y-1)
个格子的路径数目
L[y]
中存放的为到达第(x-1, y)
个格子的路径数目
我们更新L[y]
中的数据
L[y] = L[y] + L[y - 1];
依此类推,当循环结束,L数组中存放的即为最后一行的路径数目
最后一个下标对应的数字即为我们需要的答案
JavaScript代码
/**
* @param {number} m
* @param {number} n
* @return {number}
*/
var uniquePaths = function(m, n) {
var row = n;
var col = m;
if(row == 0 || col == 0) return 0;
var l = new Array();
for(var i = 0; i < row; i++) {
// l[i] = new Array();
for(var j = 0; j < col; j++) {
if(j == 0) {
l[j] = 1;
}
else if(i == 0) {
l[j] = 1;
}
else {
l[j] = l[j - 1] + l[j];
}
}
}
return l[col - 1];
};