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.
1,动态规划
在leetcode上实际运行时间为5ms。时间复杂度为O(m*n)
到达一个点,有两个途径,从左方,和上方。即到达一个点路径数为到达其左邻居路径数+到达其上方邻居路径数。
由于到达每行第一列的路径数,总为1。 故只需要保存上一行的路径数即可。 空间复杂度为O(n)。而不需要O(m*n)
当然,每一列的第一行,也总为1。只需要保存上一列也可。
如果要省空间的话,可以选择m,n较小者。 不过此题无所谓,m,n都很小。
class Solution { public: int uniquePaths(int m, int n) { vector<int> path(n); path[0] = 1; for (int i=0; i<m; i++) { for (int j=1; j<n; j++) { path[j] += path[j-1]; } } return path[n-1]; } };
2. 组合方法
到达终点,共需要m-1次向下移动,n-1次向右移动。
即一共需要m+n-2次移动。
此问题可以转换为,在m+2-2次移动步数中,选择第k步为向下移动,一共选出m-1步。 一组选择,即为一个条路径。由此就转换为一个组合问题。
时间复杂度为O(min(m,n)),空间复杂度为O(1)
在leetcode上实际执行时间为2ms。
class Solution { public: int uniquePaths(int m, int n) { int small = min(m, n); int large = max(m, n); long long result = 1, mul = 1; while (--small) { mul *= small; result *= large + small - 1; } return result / mul; } };
原文地址:http://blog.csdn.net/elton_xiao/article/details/44871789