力扣 65不同路徑

2021-09-22 07:54:27 字數 2870 閱讀 2595

最近在刷力扣上的題目,刷到了65不同路徑,當初上大學的時候,曾在hihocoder上刷到過這道題目,但是現在已經幾乎全忘光了,大概的知識點是動態規劃,如今就讓我們一起來回顧一下。

題目原文是:

乙個機械人位於乙個 m x n 網格的左上角 (起始點在下圖中標記為「start」 )。

機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角(在下圖中標記為「finish」)。

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

我們先按照正常思路來想一下,當你處於起點時,你有兩個選擇,向右或者向下,除非你處於最下面一排或者最右邊一列,那你只有一種選擇(比如處於最下面一排,你只能往右),其他位置,你都有兩種選擇。

因此,我們就根據這個思路,可以寫出**:

class solution 

// 當前處於(1,1),終點為(m,n)

return walk(1, 1, m, n);

}public int walk(int x, int y, int m, int n)

// 處於最下面一排或者最右邊一列

if (x >= m || y >= n)

// 往下走,有多少種走法

int down = walk(x, y + 1, m, n);

// 往右走,有多少種走法

int right = walk(x + 1, y, m, n);

// 從當前(x,y)出發,走到(m,n),共有多少種走法

return down + right;}}

我們考慮一下,這種寫法,有沒有可以優化的地方。

你們應該一眼就發現,walk方法的第乙個判斷if (x >= m && y >= n),永遠都不可能為true,因為下乙個判斷if (x >= m || y >= n)就已經是臨界點情況,直接就已經有返回值,根本不可能達到x >= m && y >= n的情況。因此,該判斷可以刪除。

假設我們從(1,1)的位置出發,終點是(3,3),那麼到達(2,2)這個中間點的話有幾種走法呢?兩種,先到(1,2)再到(2,2),或者,先到(2,1)再到(2,2)。

因此,如果根據我們上面的寫法,從(2,2)到終點(3,3),我們會算兩次,雖然這樣的思路本身是正確,但這樣的情況應該是可以優化的。因為從(1,1)到(3,3),一共只有6種路徑,但已經有2條是重複的路徑了,那麼隨著mn越來越大,中間點會越來越多,那麼重複的路徑也會越來越多。

這就是前面的選擇對於後面的選擇會有影響,即使後面的選擇相同,但由於前面的選擇不同,從而也被認為是不同的選擇。

很明顯,後面的選擇更加唯一,如果我們先在後面做出選擇,那麼就可以減少重複計算的次數。因此,我們可以試試反向思路。

如果我們不是從起點出發,而是從終點倒退到起點開始算的話。假設終點是(3,3),它只能由(2,3)和(3,2)直接到達,(2,3)也只能由(2,2)和(1,3)直接到達,(1,3)只能由(1,2)直接到達,(1,2)只能由(1,1)直接到達,因此(1,3)只能由(1,1)直達。

我們可以得出規律:除了最左邊一列和最上面一排的點,只能由起點(1,1)直達以外,其他的點(x,y)都是由(x-1,y)和(x,y-1)兩個點直接到達的。

因此,根據這個思路,我們可以寫出**:

class solution  else }}

return result[m - 1][n - 1];}}

其實這樣的想法就已經是動態規劃的範疇了,我們看看維基上的定義

動態規劃(英語:dynamic programming,簡稱dp)是一種在數學、管理科學、電腦科學、經濟學和生物資訊學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。

一開始我感覺很像分治法,因為都需要將乙個大問題分解為子問題,但分治法最終會將子問題合併,但動態規劃卻不用。

我們考慮一下,這種寫法,有沒有可以優化的地方。

首先是空間上的優化,我們一定要用二維陣列嗎?可以用一維陣列代替嗎?

答案是肯定的,因為每個點的計算只和左邊與上邊相鄰的點有關,因此,不需要更加久遠的點。

一維陣列

class solution 

else }}

return dp[m-1];}}

這樣的優化,差不多就結束了。那我們是否可以從思路上進行優化呢?

因為我們只有向右或向下兩種選擇,而我們一共要走的路徑其實是(m-n-2),其中有(m-1)的路徑是向右,(n-1)的路徑是向下,其實可以轉變為:

(m-n-2)中挑出(m-1),即組合數c((m-n-2), (m-1))的值

那麼我們可以寫出**:

class solution 

return (int)(num / denom);}}

##總結

力扣62 不同路徑

乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?示例 1 輸入 m 3,n 7 輸出 28 示例 2 輸入 m 3,n 2 輸出 3 解釋 從左上角...

力扣 62 不同路徑

題目 乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?示例 1 輸入 m 3,n 7 輸出 28 題解 這是個楊輝三角形,每個位置的路徑 該位置左邊...

力扣 62 不同路徑

乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?例如,上圖是乙個7 x 3 的網格。有多少可能的路徑?說明 m 和 n 的值均不超過 100。示例 ...