letcode每日一題 不同路徑

2022-07-11 03:57:11 字數 1570 閱讀 3467

話不多說,我們上題目:

方法一:動態規劃

我們用 f(i, j)表示從左上角走到 (i, j) 的路徑數量,其中 i 和 j 的範圍分別是 [0, m)和 [0, n)。

由於我們每一步只能從向下或者向右移動一步,因此要想走到 (i, j),如果向下走一步,那麼會從 (i−1,j) 走過來;

如果向右走一步,那麼會從 (i, j-1)走過來。因此我們可以寫出動態規劃轉移方程:

f(i, j) = f(i-1, j) + f(i, j-1)

需要注意的是,如果 i=0,那麼 f(i-1,j)並不是乙個滿足要求的狀態,我們需要忽略這一項;同理,如果 j=0,那麼

f(i,j-1) 並不是乙個滿足要求的狀態,我們需要忽略這一項。

初始條件為 f(0,0)=1,即從左上角走到左上角有一種方法。

最終的答案即為 f(m-1,n-1)。

**實現如下:

public int uniquepaths(int m, int n) 

return bianli(m,n);

}public int bianli(int m, int n)else if(n>1 || m>1)else

}

雖然遞迴運算的結果和動態規劃的結果相同,但是遞迴的在執行的時候卻超時了,了解了一下,記錄下

原因:大家都知道遞迴的實現是通過呼叫函式本身,函式呼叫的時候,每次呼叫時要做位址儲存,引數傳遞等,這是通過

乙個遞迴工作棧實現的。具體是每次呼叫函式本身要儲存的內容包括:區域性變數、形參、呼叫函式位址、返回值。

那麼,如果遞迴呼叫n次,就要分配n區域性變數、n形參、n呼叫函式位址、n返回值,這勢必是影響效率的,同時,

這也是記憶體溢位的原因,因為積累了大量的中間變數無法釋放。

1.1用迴圈效率會比遞迴效率高嗎?

遞迴與迴圈是兩種不同的解決問題的典型思路。當然也並不是說迴圈效率就一定比遞迴高,遞迴和迴圈是兩碼事,

遞迴帶有棧操作,迴圈則不一定,兩個概念不是乙個層次,不同場景做不同的嘗試。

2.1遞迴演算法:

優點:**簡潔、清晰,並且容易驗證正確性。(如果你真的理解了演算法的話,否則你更暈)

缺點:它的執行需要較多次數的函式呼叫,如果呼叫層數比較深,需要增加額外的堆疊處理(還有可能出現堆疊溢

出的情況),比如引數傳遞需要壓棧等操作,會對執行效率有一定影響。但是,對於某些問題,如果不使用遞迴,

那將是極端難看的**。

2.2迴圈演算法:

優點:速度快,結構簡單。

缺點:並不能解決所有的問題。有的問題適合使用遞迴而不是迴圈。如果使用迴圈並不困難的話,最好使用迴圈。

2.3遞迴演算法和迴圈演算法總結:

1) 一般遞迴呼叫可以處理的演算法,也可以通過迴圈去解決,常需要額外的低效處理。

2)現在的編譯器在優化後,對於多次呼叫的函式處理會有非常好的效率優化,效率未必低於迴圈。

12 9 每日一題 62 不同路徑

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

每日一題 77不同路徑 II

乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?輸入 obstaclegrid 0,0,0 0,1,0 0...

每日一題 LeetCode 63 不同路徑

每日一題,防止痴呆 乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 思路這題我一開始傻傻的想到dfs,可能是反應,看到地圖就想dfs和bfs 然後也沒考慮時間複雜度就寫了,結...