C++練習——LeetCode:70. 爬樓梯

LeetCode:70. 爬樓梯

假設你正在爬樓梯。需要 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 階

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/climbing-stairs

class Solution {
public:
    // 方法一:
    // 遞歸:樓頂開始思考,自上而下
	// f(n) = f(n-1) + f(n-2)  遞歸公式
	// f(1) = 1 , f(2) = 2 邊界條件
	// 動態規劃
    vector<int> dp;  
    int climbStairs(int n) {
        if(dp.empty()) dp.resize(n+1);
        if(n==1||n==2) return n;
        if(0 == dp[n]) dp[n] = climbStairs(n-1) +climbStairs(n-2);  // 減少重複遞歸計算
        return dp[n];
    }
    
	// 方法二:
    // 迭代:樓底開始思考,自下而上
    int climbStairs(int n) {
        if(n==1||n==2) return n;
        int prev =1; // 臺階1
        int curr =2; // 臺階2
        for(int i=3;i<=n;++i){
            int res = prev + curr;
            prev = curr;
            curr = res;
        }
        return curr;
    }
};



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章