题目链接
注意点
- 数字很大,结果可能会溢出
解法
解法一:dfs,效率很低。
class Solution {
public:
void dfs(int x,int y,int& ret,int m,int n,vector<vector<int>> direction)
{
if(x == m-1 && y == n-1)
{
ret++;
return;
}
//cout << x << " " << y << endl;
if(x+1 <= m-1) dfs(x+direction[0][0],y+direction[0][1],ret,m,n,direction);
if(y+1 <= n-1) dfs(x+direction[1][0],y+direction[1][1],ret,m,n,direction);
}
int uniquePaths(int m, int n) {
int ret = 0;
vector<vector<int>> direction{{1,0},{0,1}};
dfs(0,0,ret,m,n,direction);
return ret;
}
};
解法二:dp,走到某一格的位置等于它左边和上面格子的dp值之和。其实只需要一个一维数组也可以实现。时间复杂度O(mn)
class Solution {
public:
int uniquePaths(int m, int n) {
int i,j,dp[n][m];
for(i = 0; i < n;i++)
{
for(j = 0;j < m;j++)
dp[i][j] = 0;
}
dp[0][0] = 1;
for(i = 0;i < n;i++)
{
for(j = 0;j < m;j++)
{
if(i-1 >= 0) dp[i][j] += dp[i-1][j];
if(j-1 >= 0) dp[i][j] += dp[i][j-1];
}
}
return dp[n-1][m-1];
}
};
解法三:参见Code_Ganker的博客。我的代码和他的略有不同,我没有区分m和n哪个更小,这样最后就要进行四舍五入。
class Solution {
public:
int uniquePaths(int m, int n) {
double num = 1, denom = 1; // int may overflow
for (int i = 1; i <= n - 1; i++)
{
num *= m + n - 1 - i;
denom *= i;
}
return (int)(num / denom + 0.5); // to the nearest whole number
}
};
小结
- 动态规划题