题目描述:
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的矩阵做加法就可以了。
我的代码:
class Solution:
def uniquePaths(self, m, n):
if m == 1 or n == 1:
return 1
return self.uniquePaths(m, n - 1) + self.uniquePaths(m - 1, n)
class Solution:
def uniquePaths(self, m, n):
rel = [[1 for _ in range(n)] for _ in range(m)]
for i in range(1, m):
for j in range(1, n):
rel[i][j] = rel[i-1][j] + rel[i][j-1]
return rel[-1][-1]
Discuss:
def uniquePaths1(self, m, n):
if not m or not n:
return 0
return math.factorial(m+n-2)/(math.factorial(n-1) * math.factorial(m-1))
数学方法计算好,直接用公式返回值,不推荐。
def uniquePaths(self, m, n):
if not m or not n:
return 0
cur = [1] * n
for i in xrange(1, m):
for j in xrange(1, n):
cur[j] += cur[j-1]
return cur[-1]
这个想法很好,很大程度上降低了空间复杂度。
学到:
- 难得写出一次递归的代码,哈哈,但是这个东西不能乱用啊,复杂度是个问题。