思路
哈哈哈哈我自己做出来了!!
可以回忆基础题里的爬楼梯,只不过现在是二维的。
依然是用动态规划五部曲做出来的。
因为只能向右和向下,所以 dp[i][j] =dp[i-1][j]+ dp[i][j-1],由左边和上边的格子向右/下走一步到达。
注意:第一行和第一列只能通过向右/下到达,都是1。也就是我们的dp初始化。
注意点
JS创建二维数组的方法。。我是直接数组字面量了
var uniquePaths = function(m, n) {
let dp=[[]] //数组字面量
let dp = new Array(m).fill(1).map(() => new Array(n).fill(1)); //直接初始化为1(这样就不用下面的两个for了,注意这里fill传递是引用所以要匿名函数写)
const dp = new Array(m).fill().map(item => Array(n))
dp[0,0] =0
for(let i=0;i<m;i++){
dp[i,0] =1
}
for(let j=0;j<n;j++){
dp[0,j] =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]
console.log(dp[i,j])
}
}
return dp[m-1,n-1]
};
数论法
在这个图中,可以看出一共m,n的话,无论怎么走,走到终点都需要 m + n - 2 步。
在这m + n - 2 步中,一定有 m - 1 步是要向下走的,不用管什么时候向下走。
那么有几种走法呢? 可以转化为,给你m + n - 2个不同的数,随便取m - 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;
};