您的位置:首页 > 产品设计 > UI/UE

[leetcode] Unique Paths

2015-06-24 20:43 627 查看
From : https://leetcode.com/problems/unique-paths/
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).

How many possible unique paths are there?



Above is a 3 x 7 grid. How many possible unique paths are there?

Note: m and n will be at most 100.

Solution 1:

grid[m]
的数组,grid[i][j] =grid[i-1][j]
+
grid[i][j-1],空间时间复杂度O(m*n)。用滚动数组空间复杂度可降为O(n).

class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> grid(m, vector<int>(n));
for(int i=0; i<m; i++) grid[i][0]=1;
for(int j=0; j<n; j++) grid[0][j]=1;
for(int i=1; i<m; i++) {
for(int j=1; j<n; j++) {
grid[i][j] = grid[i-1][j]+grid[i][j-1];
}
}
return grid[m-1][n-1];
}
};


优化得到:

class Solution {
public:
int uniquePaths(int m, int n) {
vector<int> line(n, 1);
for(int i=1; i<m; i++) {
for(int j=1; j<n; j++) {
line[j] = line[j-1]+line[j];
}
}
return line[n-1];
}
};


Solution 2:
向下走m-1, 向右走n-1。即从m+n-2步中,找出m步往下,其余步向右即可。组合数 C(m+n-2, m-1); 组合数可以用杨辉三角求。

class Solution {
public:
int uniquePaths(int m, int n) {
vector<int> line;
if(m==1 || n==1) return 1;
n = m+n-2;
line.push_back(1);
for(int i=0; i<n; i++) {
line.push_back(1);
for(int j=line.size()-2; j>0; j--) {
line[j] = line[j]+line[j-1];
}
}
return line[m-1];
}
};


最后我笑了。

class Solution {
public:
int uniquePaths(int m, int n) {
double dom = 1;
double dedom = 1;
int small = m<n? m-1:n-1;
int big = m<n? n-1:m-1;
for(int i=1;i<=small;i++) {
dedom *= i;
dom *= small+big+1-i;
}
return (int)(dom/dedom);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: