1. 程式人生 > >Leetcode:62. 不同路徑

Leetcode:62. 不同路徑

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

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

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

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

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

解題思路:

乍一看像是個搜尋演算法,仔細一想並不是,因為他只能往下或者往右!!!用函式Road(x,y)來描述x,y到終點的路徑數目。首先要想到這個遞推關係:

Road(x,y)=Road(x+1,y)+Road(x,y+1);

注意圖是有邊界的,上面圖中終點在(7,3),於是Road(6,3)=Road(7,2)=1。仔細觀察可以發現最後一行和最後一列除終點外Road(x,y)都等於1。確定這些值就完全可以求出整個圖的Road(x,y)了。求解的順序是最後一列到第一列,每一列都是自底向上搜尋。最終輸出Road(0,0)即可。

演算法的時間複雜度為格子的總個數。

C++程式碼
class Solution { public:     int uniquePaths(int m, int n) {         vector<vector<int>> data(n, vector<int>(m, 1));         if (m == 1 || n == 1) return 1;         for (int j = m - 1; j >= 1; j--) {             for (int i = n - 1; i >= 1; i--) {                 data[i - 1][j - 1] = data[i][j - 1] + data[i - 1][j];             }         }         return data[0][0];     } };