A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram below).
The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked ‘Finish’ in the diagram below).
递归超时
class Solution {
public:
int uniquePaths(int m, int n) {
int ret = 0;
findPath(m, n, 1, 1, ret);
return ret;
}
private:
void findPath(int m, int n, int x, int y, int& ret) {
if (x != m)
findPath(m, n, x + 1, y, ret);
if (y != n)
findPath(m, n, x, y + 1, ret);
if (x == m && y == n)
++ret;
return;
}
};
动态规划
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int> > p(m + 1, vector<int>(n + 1, 1));
for (size_t i = 2; i<= m; ++i){
for (size_t j = 2; j <= n; ++j) {
p[i][j] = p[i - 1][j] + p[i][j - 1];
}
}
return p[m][n];
}
};
参考后
空间优化
class Solution {
public:
int uniquePaths(int m, int n) {
// m < n;
if (m > n) return uniquePaths(n, m);
vector<int> p(m, 0);
// 1,1 -> 1,x 有一种路径
p[0] = 1;
for (size_t i = 0; i != n; ++i)
for (size_t j = 1; j != m; ++j)
p[j] = p[j] + p[j - 1];
return p[m - 1];
}
};