【每日一題-leetcode】70.爬樓梯

70.爬樓梯

  1. 爬樓梯

難度簡單943

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

1.遞歸

時間複雜度:O(2^n)

空間複雜度:O(n)

//暴力破解
    public int climbStairs(int n) {
        return climbStairs(0,n);
    }

    // i記錄當前階數  n代表目標階數
    public int climbStairs(int i,int n){
        if(i>n){
            return 0;
        }
        if(i == n){
            return 1;
        }
        return climbStairs(i+1,n)+climbStairs(i+2,n);
    }

2.記憶化遞歸

可以看到第一種解法 會出現重複計算。

時間複雜度:O(n)

空間複雜度: O(n)

   //記憶化遞歸
        public int climbStairs(int n) {
            int [] memo = new int [n+1];
            return climbStairs(0,n,memo);
        }
    
        public int climbStairs(int i,int n,int [] memo){
            if(i>n){
                return 0;
            }
            if(i == n){
                return 1;
            }
            if(memo[i]>0){
                return memo[i];
            }
            memo[i] = climbStairs(i+1,n,memo)+climbStairs(i+2,n,memo);
            return memo[i];
        }

3.動態規劃

time : O(n)

space:O(n)

用一個數組存儲 n階需要的步數,自底向上編程,先求出最開始的 一步一步向上求解。而遞歸雖然直接求解的是n階的所需要的步數,但是由於不斷地遞歸調用自身,也就先求解出最小的階數,一步一步向上求解。

 //動態規劃  ->自底向上編程
        public int climbStairs(int n) {
            if( n ==  1) 
                return 1;
            int [] dp = new int [n+1];
            dp[1] =  1;
            dp[2] =  2;
            for(int i=3;i<=n;i++){
                dp[i] = dp[i-1] + dp[i-2];
            }
            return dp[n];
        }

4.斐波那契數列

時間複雜度:O(n)

空間複雜度:O(1)

   //斐波那契數列
        public int climbStairs(int n) {
            if(n == 1){
                return 1;
            }
            int first = 1;
            int second = 2;
            int third = 0;
            for(int i=3;i<=n;i++){
                third = first + second; // 1 + 2
                first = second; // 2
                second = third; // 3
            }
            return second;
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章