本题给了一个坐标格子,要求机器人从地图的左上角移动到右下角,每次只能向右或者向下移动一个格子,求一共有多少路径可以到达右下角。
解题:看到路径规划,第一反应是用递归的方法。但是这里有一个需要注意的点是机器人只能向右或者向下移动,因此我们的递归边界不用放置在到达终点,而可以放在到达右边界或者下边界的任意一点(因为只要到达右边界,剩下的路只能一直向下走,到达下边界同理),只要到达右或下边界即可认为找到一条路。代码如下:
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
self.res=0
self.findway(m,n)
return self.res
def findway(self,m,n):
if m==1 or n==1:
self.res+=1
return
self.findway(m-1,n)
self.findway(m,n-1)
可惜的是递归的方法时间复杂度为O(2^N),最终因为超时,没有通过,但是方法肯定是正确的。
现在用动态规划的方法来做,对非左上边界的任意一个格子,要到达这个格子,可从它的上面或者左边到达,因此到达该格子的路线总数等于到达该格子左边格子的路线总数加上到达该格子上面格子路线总数之和。(到达上边界和左边界任意一点的路线总数都为1),然后一直递推下去,最后得到最右下角也就是终点路线总数就行。这种方法的时间复杂度为O(n^2)。
代码:
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
dp=[[1]*m for i in range(n)]
for i in range(1,n):
for j in range(1,m):
dp[i][j]=dp[i][j-1]+dp[i-1][j]
return dp[n-1][m-1]