1. 程式人生 > >[Leetcode62] 不同路徑

[Leetcode62] 不同路徑

一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。問總共有多少條不同的路徑?

這題剛開始做以為很難,後來一向發現挺簡單的,只要一個列表,另外在加一個更新它的列表就可以完成,不知道還有沒有更好的辦法。

我的思路:

假如m = 7,n = 3。我們可以建立一個維度為 m - 1 或者 n - 1 的全 1 向量 nums 。然後建立一個臨時向量 temp 去更新它,temp 第一次第一個元素為 2 ,往後更新每次 +1 。更新方式:temp 的下一個(第 i 個)元素都等於上一個元素( i - 1 )加上 nums 裡對應索引( i )的元素。構造完 temp 後將 temp 賦給 nums,繼續上一次的更新方式。那麼這裡:

nums -> [1, 1, 1, 1, 1, 1] -> [2, 3, 4, 5, 6, 7] -> [3, 6, 10, 15, 21, 28]

temp -> [2, 3, 4, 5, 6, 7] -> [3, 6, 10, 15, 21, 28]

最後返回 nums 或者 temp 的最後一個元素就是路徑個數。

python:

class Solution(object):
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        if m == 1 or n == 1:
            return 1
        store = [1] * (m - 1)
        for i in range(1,n):
            temp = [i + 1]
            for j in range(1,m - 1):
                temp.append(store[j] + temp[-1])
            store = list(temp)
        return store[-1]
            

C++: 

class Solution {
public:
    int uniquePaths(int m, int n) {
        if(m == 1 || n == 1) return 1;
        vector<int> nums;
        for(int i = 0;i < (m - 1);i++) nums.push_back(1);
        for(int i = 1;i < n;i++){
            vector<int> temp;temp.push_back(i+1);
            for(int j = 1;j < nums.size();j++) temp.push_back(nums[j] + temp.back());
            nums = temp;
        }
        return nums.back();
    }
};