1. 程式人生 > 其它 >【LeetCode】NO.70 爬樓梯 (C++ & Python) [動態規劃]

【LeetCode】NO.70 爬樓梯 (C++ & Python) [動態規劃]

動態規劃第二彈!!!

題目:爬樓梯 easy

假設你正在爬樓梯。需要 n 階你才能到達樓頂。

每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?

注意:給定 n 是一個正整數。

思路

動態規劃題

  1. 考慮到達第i層的時候
    在第i-2層每次跳兩步達到第i層
    在第i-1層跳1步到達第i層
    為什麼要考慮i-1和i-2:
    這是因為本來有兩種狀態可以到達第i層
    我們要把這兩種狀態找出來之後組合之後就是到達第i層的所有狀態,求出狀態轉移方程;
    之後初始化;

程式碼

Python

class Solution:
    def climbStairs(self, n: int) -> int:
        if n<=2:
            return n
        dp = [0]*(n+1)
        dp[0]=1
        dp[1]=1
        dp[2]=2
        sum = 0
        for i in range(3,n+1):
            sum = dp[2] + dp[1]
            dp[1] = dp[2]
            dp[2] = sum
        print(sum) 
        return sum

C++


class Solution {
public:
    int climbStairs(int n) {
        vector<int> dp(n+1); //初始化陣列
        if (n<=2){
            return n;
        }
        dp[0] = 0;
        dp[1] = 1;
        dp[2] = 2;
        for(int i=3;i<n+1;i++)
        {
            dp[i] = dp[i-2] + dp[i-1];

        }
        return dp[n];
    }

};

空間複雜度:O(n)
時間複雜度:O(n)

優化:


class Solution {
public:
    int climbStairs(int n) {
        vector<int> dp(3); //初始化陣列
        if (n<=2){
            return n;
        }
        dp[0] = 0;
        dp[1] = 1;
        dp[2] = 2;
        int sum = 0;
        for(int i=3;i<n+1;i++)
        {
            sum = dp[1] + dp[2];
            dp[1] = dp[2];
            dp[2] = sum;

        }
        return sum;
    }

};

空間複雜度:O(1)
時間複雜度:O(n)

本文來自部落格園,作者:jucw,轉載請註明原文連結:https://www.cnblogs.com/Jucw/p/15753588.html