[Leetcode62] 不同路徑
阿新 • • 發佈:2018-11-27
一個機器人位於一個 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(); } };