【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)

image

posted @ 2021-12-31 16:20  jucw  阅读(135)  评论(0编辑  收藏  举报