演算法 爬樓梯之PHP實現

2021-09-24 04:06:04 字數 2491 閱讀 5486

假設你正在爬樓梯。需要 n 階你才能到達樓頂。

每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?

注意:給定 n 是乙個正整數。

示例 1:

輸入: 2

輸出: 2

解釋: 有兩種方法可以爬到樓頂。

1. 1 階 + 1 階

2. 2 階

示例 2:

輸入: 3

輸出: 3

解釋: 有三種方法可以爬到樓頂。

1. 1 階 + 1 階 + 1 階

2. 1 階 + 2 階

3. 2 階 + 1 階

假設你正在爬樓梯。需要 n 階你才能到達樓頂。

每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?

演算法

在暴力法中,我們將會把所有可能爬的階數進行組合,也就是 1 和 2 。而在每一步中我們都會繼續呼叫 climbstairsclimbstairs 這個函式模擬爬 1 階和 2 階的情形,並返回兩個函式的返回值之和。

climbstairs(i,n)=climbstairs(i+1,n)+climbstairs(i+2,n)

其中 i定義了當前階數,而 n 定義了目標階數。

<?php 

function climb_stairs($i, $n)

if ($i == $n)

return climb_stairs($i + 1, $n) + climb_stairs($i + 2, $n);

}$n = 7;

var_dump(climb_stairs(0, $n));

複雜度分析

演算法

在上一種方法中,我們計算每一步的結果時出現了冗餘。另一種思路是,我們可以把每一步的結果儲存在 memo 陣列之中,每當函式再次被呼叫,我們就直接從 memo 陣列返回結果。

在 memo 陣列的幫助下,我們得到了乙個修復的遞迴樹,其大小減少到 n 。

<?php 

function climb_stairs($i, $n, &$memo)

if ($i == $n)

if (isset($memo[$i]))

$memo[$i] = climb_stairs($i + 1, $n, $memo) + climb_stairs($i + 2, $n, $memo);

return $memo[$i];

}$memo = ;

var_dump(climb_stairs(0, 8, $memo));

複雜度分析演算法

不難發現,這個問題可以被分解為一些包含最優子結構的子問題,即它的最優解可以從其子問題的最優解來有效地構建,我們可以使用動態規劃來解決這一問題。

第 ii 階可以由以下兩種方法得到:

在第 (i-1)(i−1) 階後向上爬一階。

在第 (i-2)(i−2) 階後向上爬 22 階。

所以到達第 ii 階的方法總數就是到第 (i-1)(i−1) 階和第 (i-2)(i−2) 階的方法數之和。

令 dp[i]表示能到達第 ii 階的方法總數:

dp[i]=dp[i-1]+dp[i-2]

<?php 

function climbstairs($n)

$dp = ;

$dp[1] = 1;

$dp[2] = 2;

for ($i = 3; $i <= $n; $i++)

return $dp[$n];

}var_dump(climbstairs(7));

複雜度分析演算法

在上述方法中,我們使用 dp 陣列,其中 dp[i]=dp[i-1]+dp[i-2]。可以很容易通過分析得出 dp[i] 其實就是第 i個斐波那契數。

fib(n)=fib(n−1)+fib(n−2)

現在我們必須找出以 1 和 2 作為第一項和第二項的斐波那契數列中的第 n 個數,也就是說 fib(1)=1 且 fib(2)=2。

<?php 

function climbstairs($n)

$first = 1;

$second = 2;

for ($i = 3; $i <= $n; $i++)

return $second;

}var_dump(climbstairs(9));

複雜度分析

演算法之爬樓梯

題目 假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?沙雕解法一 利用遞迴,就是最後一步一定是前一步走一步或倒退兩步走兩步,超時!include pch.h include include using namespace std i...

python爬樓梯演算法 爬樓梯(Python3)

假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1 階 1 階 和 2 階 解題思路 實現了兩種方法,但是第一種超出時間限制 因為遞迴的時候方...

爬樓梯演算法

有n階樓梯,有1,2,3 走m步走完樓梯,一共有多少種走法,並輸出所有的走法 設走n階台階的走法數為 f n 可以得到 f 1 1 f 2 2 f 3 4 對於n 3時,縮小問題規模 最後一步上乙個台階的話,之前上了n 1個台階,走法為f n 1 最後一步上兩個台階的話,之前上了n 2個台階,走法為...