題目:一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
思考:在臺階數少的時候,可以手動計算一下跳臺階的跳法。
臺階數 = 1時,
1 總共1種
臺階數 = 2時,
1 + 1, 2 總共2種
臺階數 = 3時,
1 + 1 + 1, 1 + 2, 2 + 1, 3 總共4種
臺階數 = 4時,
1 + 1 + 1 + 1, 1 + 1 + 2, 1 + 2 + 1, 2 + 1 + 1, 2 + 2, 3 + 1, 1 + 3, 4 總共8種
另臺階數爲1時的跳法爲f(1), 臺階數爲2時的跳法爲f(2), 臺階數爲3時的跳法爲f(3),以此類推,臺階數爲n時的跳法爲f(n)。
f(1) = 1; f(2) = 2; f(3) = 4; f(4) = 8...
可以找到以下規律,
f(1) = 1
f(2) = f(1) + 1 = 1 + 1 = 2
f(3) = f(2) + f(1) + 1 = 2 + 1 + 1 = 4
f(4) = f(3) + f(2) + f(1) + 1 = 4 + 2 + 1 + 1 =8
可以另f(0) = 1, 能夠發現以下規律
f(1) = f(0)
f(2) = f(1) + f(0) = 1 + 1 = 2
f(3) = f(2) + f(1) + f(0) = 2 + 1 + 1 = 4
f(4) = f(3) + f(2) + f(1) + f(0) = 4 + 2 + 1 + 1 =8
以此類推,可以得出
f(n) = f(n - 1) + f(n - 2) + f(n - 3) + ... + f(2) + f(1) + f(0)
編程書寫情況和運行結果如下所示,
class Solution {
public:
int jumpFloorII(int number) {
vector<int> f(number + 1);
f[0] = 1;
f[1] = 1;
for(int i = 2; i <= number; i++) {
f[i] = 0;
for(int j = 0; j < i; j++) {
f[i] += f[j];
}
}
return f[number];
}
};
以上代碼測試結果,運行時間:2ms 佔用內存:480K
當然,此題還有更優解法
例如,把f(n) = f(n - 1) + f(n - 2) + f(n - 3) + ... + f(2) + f(1) + f(0)繼續優化
f(n - 1) = f(n - 2) + f(n - 3) + ... + f(2) + f(1) + f(0)
f(n) = f(n - 1) + f(n - 1) = 2 * f(n - 1)
當n = 1,f(1) = 1;
當n > 1, f(n) = f(n - 1) + f(n - 1) = 2 * f(n - 1)
編程書寫情況和運行結果如下所示,
class Solution {
public:
int jumpFloorII(int number) {
if(number == 1) {
return 1;
}
else {
return 2 * jumpFloorII(number - 1);
}
}
};
以上代碼測試結果,運行時間:4ms 佔用內存:476K