爬臺階---算法彙總

1,leetcode網址

https://leetcode-cn.com/problems/climbing-stairs/submissions/

2,題目

假設你正在爬樓梯。需要 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
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

3,解題方法

分析,

第一級:1種,一步跨上去 

第二級:2種,1)直接一步跨;2)一級一級走。

第三級:3種,總歸是 第一級和第二級的和。

即當前i處臺階,一定是從i-1或者i-2處臺階登上。

即轉換成斐波拉契數列問題。

即f(n) = f(n)+f(n-1)

思路一的代碼:

class Solution {

    //其實轉換成斐波拉契數列問題,f(n) = f(n)+f(n-1)
    //使用數組緩存每一步的結果。稱之爲記憶遞歸
    public int climbStairs(int n) {
       int[] dp = new int[n+2];
       dp[0] = 0;
       dp[1] = 1;
       dp[2] = 2;

       for(int i = 3;i<=n;i++){
           dp[i]  = dp[i-1]+dp[i-2];
       }

       return dp[n];
    }
}

思路二

class Solution {
    
    public int climbStairs(int n) {
       if(n ==1){
           return 1;
       }

       int first = 1;
       int second = 2;

       for(int i = 3;i<=n;i++){
           int third = first +second;
           first = second;
           second = third;
       }

       return second;
    }
}

 

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