有乙個機械人的位於乙個 m × n 個網格左上角。
機械人每一時刻只能向下或者向右移動一步。機械人試圖達到網格的右下角。
問有多少條不同的路徑?
給出 m =3
和 n =3
, 返回6
.
給出 m =4
和 n =5
, 返回35
.
n和m均不超過100
剛做這個題目的時候,自己先在本子上畫了畫路徑,並舉了幾個例子,發現沒有什麼聯絡。想想前面的幾道題目,都會對第一行和第一列進行處理。在這個題目中,到達第一行或者第一列都會只有一種路徑,而到達(i,j)位置的路徑數,就是(i-1,j)位置和(i,j-1)位置的相加的和(這個自己舉個例子就可以理解了)。
**:
public class solution {
/*** @param m: positive integer (1 <= m <= 100)
* @param n: positive integer (1 <= n <= 100)
* @return: an integer
*/public int uniquepaths(int m, int n) {
// write your code here
if(m==0||n==0)
return 0;
int res= new int[m][n];
for(int i=0;i**交上去對了,確實有點開心,但是自己設計的太耗時。。。
對自己的**做出如下優化:
public class solution {
/*** @param m: positive integer (1 <= m <= 100)
* @param n: positive integer (1 <= n <= 100)
* @return: an integer
*/public int uniquepaths(int m, int n) {
// write your code here
if(m==0||n==0)
return 0;
/*int res= new int[m][n];
for(int i=0;i改完之後,在提交:
解釋如下:
機械人總共走m+n-2步,其中m-1步往下走,n-1步往右走,本質上就是乙個組合問題,也就是從m+n-2個不同元素中每次取出m-1個元素的組合數。根據組合的計算公式,我們可以寫**來求解即可。**如下:
public int uniquepaths(int m, int n) {
double dom = 1;
double dedom = 1;
int small = m上面的**求解了組合的結果,只需要做一次行或者列的掃瞄,所以時間複雜度是o(min(m,n)),而空間複雜度是o(1)。比起上面的兩種解法更優。不過這裡有個弊端,就是如果**中的dom和dedom如果不是double,而是用int,那麼會很容易越界,因為這是乙個階乘,所以大家在面試中討論這種方法要注意和提及越界的問題。
動態規劃 不同路徑
乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 img yrgqqaoc 1607527...
動態規劃 不同路徑(I,II
不同路徑 乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?例如,上圖是乙個7 x 3 的網格。有多少可能的路徑?說明 m 和 n 的值均不超過 10...
62 不同路徑 動態規劃
乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?本質上就是乙個 楊輝三角。這是個楊輝三角形,每個位置的路徑 該位置左邊的路徑 該位置上邊的路徑 動態...