LSGO——LeetCode實戰(數組系列): 62題 不同路徑 (Unique Paths)

原題:

一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記爲“Start” )。

機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記爲“Finish”)。

問總共有多少條不同的路徑?

在這裏插入圖片描述

例如,上圖是一個7 x 3 的網格。有多少可能的路徑?

說明:m 和 n 的值均不超過 100。

示例 1:

輸入: m = 3, n = 2
輸出: 3
解釋:
從左上角開始,總共有 3 條路徑可以到達右下角。

  1. 向右 -> 向右 -> 向下
  2. 向右 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向右
    示例 2:

輸入: m = 7, n = 3
輸出: 28

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/unique-paths
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

解法一:排列組合

思路:排列組合
因爲機器到底右下角,向下幾步,向右幾步都是固定的。
比如,m=3, n=2,我們只要向下 1 步,向右 2 步就一定能到達終點。

class Solution(object):
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        return int(math.factorial(m+n-2)/math.factorial(m-1)/math.factorial(n-1))  # 使用內置函數factorial進行階乘。

解法二(動態規劃):

思路:我們令 dp[i][j] 是到達 i, j 最多路徑
動態方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]
注意,對於第一行 dp[0][j],或者第一列 dp[i][0],由於都是在邊界,所以只能爲 1

程序一:

class Solution(object):
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        dp = [[1]*n] + [[1]+[0] * (n-1) for _ in range(m-1)]  # 初始化dp數組。
        #print(dp)
        for i in range(1, m):
            for j in range(1, n):
                dp[i][j] = dp[i-1][j] + dp[i][j-1]
        return dp[-1][-1]

程序二:

class Solution(object):
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        cur = [1] * n
        for i in range(1, m):
            for j in range(1, n):
                cur[j] += cur[j-1]
        return cur[-1]

解法三:遞歸:

程序一:

** 超出時間限制**

class Solution(object):
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        if(m==1 or n==1):
            return 1
        else:return self.uniquePaths(m,n-1)+self.uniquePaths(m-1,n)

程序二

** 使用a數組記錄路徑數,當路徑不爲0的時候說明該位置已經求算過,直接return。 **

class Solution(object):
    a = [[0] * (101) for i in range(101)]
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        if m == 1 or  n == 1:
            return 1
        if self.a[m][n] > 0: return self.a[m][n]
        self.a[m][n] = self.uniquePaths(m,n-1)+self.uniquePaths(m-1,n)
        return self.a[m][n]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章