1. 程式人生 > 實用技巧 >劍指offer JZ-9

劍指offer JZ-9

題目描述

一隻青蛙一次可以跳上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) return
1; 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]; } };
View Code

觀察程式碼,我們 【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) return
2; int sum = 4, now = 0; for(int i=3;i<=number;i++) { now = sum; sum += now; } return now; } };
View Code