法1:动态规划
方法类同JavaScript|LeetCode|动态规划|64.最小路径和 法2
想法:
- 使用一个一维数组dp,来保存到达当前行的每个网格的不同路径数
- 到达第一行或第一列的每个网格的不同路径数目均为1
- 到达其他网格的不同路径数目:当前网格上面的一个网格、当前网格左面的一个网格,到达这两者的不同路径数之和
/**
* @param {number} m
* @param {number} n
* @return {number}
*/
var uniquePaths = function(m, n) {
// m列,n行
var dp = [];
var i = 0, j = 0;
for(j = 0; j < m; j++) {
dp[j] = 0;
}
for(i = 0; i < n; i++) {
for(j = 0; j < m; j++) {
if(j == 0) { // 在第一列,只能从上方来,且只有一条路径
dp[j] = 1;
}
else if(i == 0) { // 在第一行,只能从左方来,且只有一条路径
dp[j] = 1;
}
else {
dp[j] = dp[j - 1] + dp[j]; // 从左方来、从上方来
}
}
}
return dp[m - 1];
};
优化
看了题解
想法:
- 由于到达第一行和第一列的网格的不同路径数均为1,所以固定dp[0]=1,只遍历除第一行、第一列的其他网格
/**
* @param {number} m
* @param {number} n
* @return {number}
*/
var uniquePaths = function(m, n) {
// m列,n行
var dp = [];
var i = 0, j = 0;
for(j = 0; j < m; j++) {
dp[j] = 1;
}
for(i = 1; i < n; i++) {
for(j = 1; j < m; j++) {
dp[j] = dp[j - 1] + dp[j]; // 从左方来、从上方来
}
}
return dp[m - 1];
};
1万+



被折叠的 条评论
为什么被折叠?



