【问题标题】:Number of Unique Paths in a matrix矩阵中唯一路径的数量
【发布时间】:2017-12-20 08:30:19
【问题描述】:

我遇到的问题是:

机器人位于 m x n 网格的左上角。机器人只能在任何时间点向下或向右移动。机器人正试图到达网格的右下角。有多少种可能的独特路径?

我提交的代码是:

class Solution(object):
    def uniquePaths(self,m,n):

        # m : (int) rows
        # n : (int) cols

        mat = [[0] * n] * m

        for i in range(n):
            mat[0][i] = 1


        for i in range(m):
            mat[i][0] = 1

        for i in range(1,m):
            for j in range(1,n):
                mat[i][j] = mat[i - 1][j] + mat[i][j - 1]

        return mat[m - 1][n - 1]

提交后,我知道我的代码只比其他提交的代码快 21%。这意味着我的代码不是最优的。所以出于好奇,我检查了另一个比我快得多的提交。

更好的解决方案是:

class Solution(object):
    def uniquePaths(self, m, n):
        p = 1
        for i in xrange(n,m+n-1):
            p *= i
        return p/self.factorial(m-1)

    def factorial(self,n):
        if n == 0:
            return 1
        return n*self.factorial(n-1)

如您所见,它的时间复杂度是线性的,而我的是二次的。但我无法理解其背后的逻辑。

【问题讨论】:

  • 您对因子的复杂性是正确的,但我认为阶乘函数仅用于计算 m 的因子。 for 循环持续 (m + n - 1 - m) 次。所以复杂度是 O(min(m,n + 1))
  • 一个好问题是打印所有可能的路径。我想你的方法会比其他方法给你更快的结果!

标签: python algorithm python-3.x data-structures dynamic-programming


【解决方案1】:

您不需要为此使用计算机程序。这是一个简单的组合问题。想象 m 个右箭头和 n 个下箭头。问这个问题的另一种方法是我们可以用多少种方式排列这些箭头?我们可以从 m+n 中为右箭头选择 m 个点。所以答案是二项式(m, m + n)

【讨论】:

    猜你喜欢
    • 2012-11-24
    • 2017-10-30
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 2015-10-25
    • 1970-01-01
    • 2021-03-18
    相关资源
    最近更新 更多