【LeetCode】 70. 爬楼梯(简单)

70. 爬楼梯(简单)

在这里插入图片描述【LeetCode】 70. 爬楼梯(简单)_第1张图片

解法一

  1. 思路

    • 定义一个数组dp,dp[i] 表示走到第 i 阶的方法数,因为我们每次可以走一步或者两步,所以第 i 阶可以从第 i-1 或 i-2 阶到达,这样记得到了状态转移方程: dp[i] = dp[i-1] + dp[i-2];
  2. 代码

    class Solution {
    public:
        int climbStairs(int n) {
            if(n <= 2) return n;
            vector<int> dp(n+1, 1);
            for(int i=2; i<=n; i++){
                dp[i]= dp[i-1] + dp[i-2];
            }
            return dp[n];
        }
    };
    
  3. 收获

    • 思路有想到,但是用的递归,会超时。

解法二:空间压缩

  1. 思路

    • 由于 dp[i] 只和 dp[i-1] 和 dp[i-2] 有关,因此可以只用两个变量来存储 dp[i-1] 和 dp[i-2],使得原来的 O(n) 空间复杂度优化为 O(1)。
  2. 代码

    class Solution {
    public:
        int climbStairs(int n) {
            if(n <= 2) return n;
            int pre1 = 1, pre2 = 2;
            int ans;
            for(int i=3; i<=n; i++){
                ans = pre1 + pre2;
                pre1 = pre2;
                pre2 = ans;
            }
            return ans;
        }
    };
    

你可能感兴趣的:(LeetCode刷题,leetcode,算法,动态规划)