題目描述:
乙個機械人位於乙個 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
問題分析:
這是乙個尋找路徑條數的問題,而且存在乙個限制條件:機械人只能向右走或者向下走,這樣的話就意味著如鏡中不存在向左走再向右走這樣無解的情況。除此我們對圖進行分析可以知道,當機械人走到了與終點同一行或者同一列的位置時,就只有一條路徑方案了,敏銳的人可能發現了,這個可以做為遞迴的終止條件,那麼我們如何確定遞迴的劃分呢?遞迴的劃分其實在題目中已經告訴了我們方法。題目高告訴我們機械人只能向下或者向右,這是不是就意味著兩條遞迴路徑呢。
舉個例項,就假設當前機械人在座標(1,5)處,終點在(2,6)處,這樣的話,我們可以發現機械人向右走得時候只有一條路徑,向下走得時候也只有一條路徑,那麼從點(1,5)到(2,6)就有turnringht+turndown=2種路徑了,在向上一層,例如(1,4)到(2,6)向下只有一條路徑,向右走一步就到了(1,5)由之前的結果我們就可以知道有兩條路徑,這樣的話,(1,4)到(2,6)有3條路徑。
**如下:
class solution
cache=new int[row][column];
return recursion(column,row,0,0);
}public int recursion(int column,int row,int x,int y)
if(cache[x][y]!=0)
int right= recursion(column,row,x+1,y);
int down= recursion(column,row,x,y+1);
cache[x][y]=right+down;
return right+down;}}
因為單純的使用遞迴會使得的時間和空間消耗過大,不滿足題意,所以在**中使用了備忘錄模式,新增了乙個快取用來儲存已經走過的點到終點的路徑數量。 Leetcode 62 不同路徑
乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?例如,上圖是乙個7 x 3 的網格。有多少可能的路徑?說明 m 和 n 的值均不超過 100。示例 ...
leetcode 62 不同路徑
時間複雜度o n2 def uniquepaths m,n 計算路徑的個數 memo 0 for j in range n for i in range m for i in range m for j in range n if i 0 and j 0 memo i j 1 elif j 0 me...
LeetCode 62 不同路徑
乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?例如,上圖是乙個7 x 3 的網格。有多少可能的路徑?說明 m 和 n 的值均不超過 100。示例 ...