62. Unique Paths

本题为动态规划问题,共有三种解决方法:

二元数组
一元数组

数学公式

return math.factorial(m+n-2)/math.factorial(m-1)/math.factorial(n-1)

采用二维数组

保存到达每一个位置所有可能的路径个数;

在数组中可以寻找到规律:

初始化上边和左边为全1;其他位置的元素=上面+左面;最后返回右下角的元素作为最终结果。

时间复杂度:O(n^2);空间复杂度:o(m*n)

 

一元数组

由于使用二元数组的过程中,更新dp[i][j]只用到了数组中本列dp[:][j]和前一列dp[:][j-1](或者本行和前一行)的数据,所以不需要保存整个m*n数组,只需要保存这两列即可。

又因为本列就是前一列更新之后的数据,所以可以只采用一个列向量,直接对这个列向量进行更新。

时间复杂度:O(n^2);空间复杂度:o(m)或者o(n)

完整代码

class Solution(object):
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int     
        #使用一元数组
        dp=[1 for _ in xrange(n)]
        for i in xrange(1,m):
            for j in xrange(1,n):
                dp[j]+=dp[j-1]
        return dp[-1]
        #使用二元数组        
        dp=[[1 for _ in xrange(m)]for _ in xrange(n)]
        for i in xrange(1,n):    #注意:xrange()的终止条件是到n-1时结束
            for j in xrange(1,m):
                dp[i][j]=dp[i-1][j]+dp[i][j-1]
        return dp[-1][-1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值