一、题目描述
二、题目翻译
就是给定你一个网格,让你在某些条件A的限制下,求出网格起点 到 终点 之间有多少条件路径。
条件限制A:start 元素每次只能向下,或者 向右 行走。
三、多来点用例
四、思路讲解
这里我们先讨论一下2*2 的网格下,起点到终点之间有多少条路可以走?
由上图可知,只有2条。但是问题来了,
- 问题1:我们如何表示网格?
- 问题2:如何用程序得出结果?
问题1
我们可以使用二维数组来表示网格,如下图所示:
代码如下:
new Array(m).fill(new Array(n));
问题2
因为题目限制,我们只能向下走、或者向右走,所以意味着 到达(0, 1)网格 的路径只有1条,到达(1, 0)网格 的路径也只有1条。
将思路意象化应为下图:
基于上面的分析,我们可以得出如下结论:
1、以单元格(1, 1) 的角度来看,想要到达这里的话,路径至少是2条,分别是(0, 1) -> (1, 1) + (1, 0) -> (1, 1) + 到达单元格(0, 1) 的路径数 + 到达单元格(1, 0)的路径数。
2、想要到达单元格(0, 1) 的路径是多少呢?递归步骤1。
3、想要到达单元格(1, 0) 的路径是多少呢?递归步骤1。
再次基于上面的分析,我们可以写出如下代码:
// m是横轴,n是纵轴
var uniquePaths = function(m, n) {
let dp = new Array(m).fill(new Array(n));
for (let x = 0; x < m, x++){
for (let y = 0; y < n; y++){
dp[x][y] = dp[x-1][y] + dp[x][y-1];
}
}
return dp[m-1][n-1]
};
但是写完上面的代码我们会发现,我们还是不能得到答案,因为二维数组里面根本就没有存值。
在问题2的最前面我们说过,到达(0, 1) 和 (1, 0)网格的路径都是1,由于条件A的限制,我们可以得出第0行上的所有单元格 以及 第0列上的所有单元格 的值都是1,所以我们再改造一下代码:
// m是横轴,n是纵轴
var uniquePaths = function(m, n) {
let dp = new Array(m).fill(new Array(n));
for (let x = 0; x < m, x++){
for (let y = 0; y < n; y++){
if (x == 0){
dp[x][y] = 1;
continue;
}
if (y == 0){
dp[x][y] = 1;
continue;
}
dp[x][y] = dp[x-1][y] + dp[x][y-1];
}
}
return dp[m-1][n-1]
};
此时我们的代码就可以ac了,啧啧啧。
五、结尾
如果这篇文章能够在思维上帮助你,还请客官不要吝啬手里的小赞赞。我们下篇文章再见喽。