LeetCode-62 不同路径(I)

211 阅读2分钟

一、题目描述

不同路径1.png

二、题目翻译

就是给定你一个网格,让你在某些条件A的限制下,求出网格起点终点 之间有多少条件路径。

条件限制A:start 元素每次只能向下,或者 向右 行走。

三、多来点用例

dp5.png

四、思路讲解

这里我们先讨论一下2*2 的网格下,起点到终点之间有多少条路可以走?

dp1.png

由上图可知,只有2条。但是问题来了,

  • 问题1:我们如何表示网格?
  • 问题2:如何用程序得出结果?

问题1

我们可以使用二维数组来表示网格,如下图所示:

dp2.png

代码如下:

    new Array(m).fill(new Array(n));

问题2

因为题目限制,我们只能向下走、或者向右走,所以意味着 到达(0, 1)网格 的路径只有1条,到达(1, 0)网格 的路径也只有1条。

将思路意象化应为下图:

dp3.png

基于上面的分析,我们可以得出如下结论:

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了,啧啧啧。

五、结尾

如果这篇文章能够在思维上帮助你,还请客官不要吝啬手里的小赞赞。我们下篇文章再见喽。