假設你正在爬樓梯。需要 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個台階,走法為...