基于Go和PHP語言實現(xiàn)爬樓梯算法的思路詳解
爬樓梯(Climbing-Stairs)
題干:
假設(shè)你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?注意:給定 n 是一個正整數(shù)。示例 1: 輸入: 2 輸出: 2 解釋: 有兩種方法可以爬到樓頂。 1. 1 階 + 1 階 2. 2 階示例 2: 輸入: 3 輸出: 3 解釋: 有三種方法可以爬到樓頂。 1. 1 階 + 1 階 + 1 階 2. 1 階 + 2 階 3. 2 階 + 1 階來源:力扣
這題爬樓梯算是算法題里面比較經(jīng)典的。
解題思路
這題的解題思路主要有兩種:
1.動態(tài)規(guī)劃
2.斐波那契數(shù)列
動態(tài)規(guī)劃算是一個比較重要的解題技巧與思路,后續(xù)我會寫一系列需要用動態(tài)規(guī)劃思路解題的文章,幫助大家更好的理解動態(tài)規(guī)劃。
這題我們用斐波那契數(shù)列來解。
斐波那契數(shù)列又稱兔子數(shù)列,指得是:1、1、2、3、5、8、13、21、……,在數(shù)學(xué)上它得遞推公式是:F(1)=1,F(xiàn)(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)。
放到這個題目中我們可以發(fā)現(xiàn):二階樓梯的走法有 2種: 1 階 + 1 階 、 2 階三階樓梯的走法有 3種:1 階 + 1 階、1 階 + 2 階、2 階 + 1 階四階樓梯的走法有 5種:1 階 + 1 階 + 1 階 + 1 階、1 階 + 2 階 + 1 階、1 階 + 1 階 + 2 階、2 階 + 2 階、2 階 + 1 階 + 1 階……
綜上,我們可以發(fā)現(xiàn) n 階樓梯有 m 種爬法,且 m 符合斐波那契數(shù)列規(guī)律,所以直接上代碼咯!
Go 實現(xiàn)
// 斐波那契數(shù)列 // 1 1 2 3 5 8 13 .... func climbStairs2(n int) int { // 1 階臺階直接返回 1 if n == 1 { return 1 } // 2 階臺階直接返回 2 if n == 2 { return 2 } current := 2 pre := 1 // 當前臺階的走法是前兩個臺階走法之和 for i := 3; i <= n;i ++ { current = current + pre pre = current - pre } return current }
PHP 實現(xiàn),一共兩版實現(xiàn),看自己喜歡哪種代碼吧
function climbStairs($n) { // if($n==1) return 1; // $dp[1]=1; // $dp[2]=2; // for($i=3;$i<=$n;$i++){ // $dp[$i]=$dp[$i-1]+$dp[$i-2]; // } // // return $dp[$n]; if($n <= 2) return $n; $dp = [1 => 1,2 => 2]; foreach(range(3,$n+1) as $v){ //遞歸加法,這個爬樓梯就是斐波拉切算法求最后f(n-1)+f(n-2)的和 $dp[$v] = $dp[$v-1] + $dp[$v-2]; } return $dp[$n]; }
總結(jié)
到此這篇關(guān)于基于Go和PHP語言實現(xiàn)爬樓梯算法的思路詳解的文章就介紹到這了,更多相關(guān)Go PHP 爬樓梯算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang等多種語言轉(zhuǎn)數(shù)組成字符串舉例詳解
今天寫代碼遇到數(shù)組轉(zhuǎn)換成字符串操作,下面這篇文章主要給大家介紹了關(guān)于Golang等多種語言轉(zhuǎn)數(shù)組成字符串的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-05-05Go語言中的數(shù)據(jù)格式(json、xml?、msgpack、protobuf)使用總結(jié)
在分布式的系統(tǒng)中,因為涉及到數(shù)據(jù)的傳輸,所以一定會進行數(shù)據(jù)的交換,此時就要定義數(shù)據(jù)交換的格式,例如二進制、Json、Xml等等。本文總結(jié)了Go語言中的數(shù)據(jù)格式,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07golang程序使用alpine編譯出最小arm鏡像實現(xiàn)
這篇文章主要為大家介紹了golang程序使用alpine編譯出最小arm鏡像,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12Go語言中實現(xiàn)打印堆棧的errors包的用法詳解
因為Go語言提供的錯誤太簡單了,以至于簡單的我們無法更好的處理問題,所以誕生了很多對錯誤處理的庫,github.com/pkg/errors是比較簡潔的一樣,本文就來聊聊它的具體用法吧2023-07-07