最近在刷力扣上的題目,刷到了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條是重複的路徑了,那麼隨著
m
與n
越來越大,中間點會越來越多,那麼重複的路徑也會越來越多。這就是
前面的選擇
對於後面的選擇
會有影響,即使後面的選擇
相同,但由於前面的選擇
不同,從而也被認為是不同的選擇。很明顯,
後面的選擇
更加唯一,如果我們先在後面做出選擇,那麼就可以減少重複計算的次數。因此,我們可以試試反向思路。如果我們不是從起點出發,而是從終點倒退到起點開始算的話。假設終點是(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。示例 ...