image.png

思路

哈哈哈哈我自己做出来了!!
可以回忆基础题里的爬楼梯,只不过现在是二维的。
依然是用动态规划五部曲做出来的。
因为只能向右和向下,所以 dp[i][j] =dp[i-1][j]+ dp[i][j-1],由左边和上边的格子向右/下走一步到达。
注意:第一行和第一列只能通过向右/下到达,都是1。也就是我们的dp初始化。

注意点

JS创建二维数组的方法。。我是直接数组字面量了

  1. var uniquePaths = function(m, n) {
  2. let dp=[[]] //数组字面量
  3. let dp = new Array(m).fill(1).map(() => new Array(n).fill(1)); //直接初始化为1(这样就不用下面的两个for了,注意这里fill传递是引用所以要匿名函数写)
  4. const dp = new Array(m).fill().map(item => Array(n))
  5. dp[0,0] =0
  6. for(let i=0;i<m;i++){
  7. dp[i,0] =1
  8. }
  9. for(let j=0;j<n;j++){
  10. dp[0,j] =1
  11. }
  12. for(let i=1;i<m;i++){
  13. for(let j =1;j<n;j++){
  14. dp[i,j] =dp[i-1,j] +dp[i,j-1]
  15. console.log(dp[i,j])
  16. }
  17. }
  18. return dp[m-1,n-1]
  19. };

image.png

数论法

在这个图中,可以看出一共m,n的话,无论怎么走,走到终点都需要 m + n - 2 步。
image.png
在这m + n - 2 步中,一定有 m - 1 步是要向下走的,不用管什么时候向下走。
那么有几种走法呢? 可以转化为,给你m + n - 2个不同的数,随便取m - 1个数,有几种取法。
那么这就是一个组合问题了。
image.png
image.png

  1. var uniquePaths = function(m, n) {
  2. let ans = 1;
  3. for (let x = n, y = 1; y < m; ++x, ++y) {
  4. ans = Math.floor(ans * x / y);
  5. }
  6. return ans;
  7. };

image.png