劍指offer JZ-9
阿新 • • 發佈:2021-01-07
題目描述
一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。 示例1輸入
複製3
返回值
複製4
思路
JZ-8的簡單變形,定義dp[k]為到達第k階臺階的方案數
不難看出:dp[k] = dp[1] + dp[2] + dp[3] + .... + dp[k-1] + 1
後面的+1 實際上就是一次跳k階這一種方案
動態規劃程式碼如下
class Solution { public: int jumpFloorII(int number) { if(number == 1) returnView Code1; if(number == 2) return 2; vector<int> dp; dp.push_back(1); dp.push_back(1); dp.push_back(2); for(int i=3;i<=number;i++) { int sum = 0; for(int j=0;j<i;j++) sum += dp[j]; dp.push_back(sum); }return dp[number]; } };
觀察程式碼,我們 【dp[k] = dp[1] + dp[2] + dp[3] + .... + dp[k-1] + 1】這一部分的計算有重複
為了節約時間和空間,我們可以用一個變數sum來記錄dp[1] + dp[2] + dp[3] + .... + dp[k-1] + 1
class Solution { public: int jumpFloorII(int number) { if(number == 1) return 1; if(number == 2) returnView Code2; int sum = 4, now = 0; for(int i=3;i<=number;i++) { now = sum; sum += now; } return now; } };