問題描述
一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
問題分析
設 f(n) 爲跳上n級臺階的跳法數。
該青蛙跳上一個n級的臺階時,在第一跳有n種跳法,分別是:跳1級、跳2級…跳n級。
跳完第一跳後,完成接下來的旅程就是下面的情況:
第一跳跳1級,接下來就有f(n-1) 種跳法到達第n級;
第一跳跳2級,接下來就有f(n-2) 種跳法到達第n級;
。。。
。。。
第一跳跳n級,直接結束旅程。
因此,我們可以把跳上一個n級的臺階 分解成 第一跳和後續,即
f(n)=f(n-1)+f(n-2)+…+f(1)+1
其中 f(n-1) 對應第一跳跳了1級的情況,f(n-2) 對應第一跳跳了2級的情況,…,f(1) 對應第一跳跳了n-1級的情況,1 對應第一跳跳了n級的情況。
同時注意到,f(n-1)=f(n-2)+f(n-3)+…+f(1)+1 ,用 f(n-1) 替換掉 f(n) 中的 f(n-2)+…+f(1)+1 ,可以得到 f(n)=2f(n-1). ;即 f(n) 是個以2爲比的等比數列。
我們再通過枚舉得到 f(1)=1, f(2)=2 ,就可以推出 f(n)=2n-1.
代碼實現
看懂算法之後,代碼就很簡單辣 ~ 一句話搞定:
class Solution {
public:
int jumpFloorII(int number) {
return pow(2,number-1);
}
};