题目:62. 不同路径
思路
动态规划
代码
以下展示3种方法:
动态规划
// f[i][j] : 到达[i][j]的路径数
// f[i][j] = f[i-1][j] + f[i][j-1];
// f[0][0] = 1,
// i: 0->m, j:0->n
//
class Solution {
public:
int uniquePaths(int m, int n) {
int i, j;
vector
// 初始化
for(i = 0; i < m; i++)
{
f[i][0] = 1;
}
for(j = 0; j < n; j++)
{
f[0][j] = 1;
}
for(i = 1; i < m; i++)
{
for(j = 1; j < n; j++)
{
f[i][j] = f[i-1][j] + f[i][j-1];
}
}
return f[m-1][n-1];
}
};
深度搜索
用递归暴力遍历呗;
class Solution {
private:
int dfs(int i, int j, int m, int n) {
if (i > m || j > n) return 0; // 越界了
if (i == m && j == n) return 1; // 找到一种方法,相当于找到了叶子节点
return dfs(i + 1, j, m, n) + dfs(i, j + 1, m, n);
}
public:
int uniquePaths(int m, int n) {
return dfs(1, 1, m, n);
}
};
数论
从起点到终点,向下位移m-1步,向右位移n-1步,所以不管怎么走,其中一定有m-1步向下,n-1向右,不同的方法向下向右的顺序不同而已; 所以到终点的路径数量为一个组合数:m+n-2中取m-1; 写代码时注意数据溢出;
class Solution {
public:
int uniquePaths(int m, int n) {
long long numerator = 1; // 分子
int denominator = m - 1; // 分母
int count = m - 1;
int t = m + n - 2;
while (count--) {
numerator *= (t--);
while (denominator != 0 && numerator % denominator == 0) {
numerator /= denominator;
denominator--;
}
}
return numerator;
}
};
精彩内容
发表评论