70.爬楼梯

题目描述

假设你正在爬楼梯。需要n阶才能达到楼顶。
每次只能爬1阶或2阶。请问共有多少种不同的方法可以爬到楼顶?

思路与算法:

我们用dp[i]来表示到第i阶的方案数,由于题目限制每次只能爬1阶或2阶,所以可以得到动态规划的转移方程:

dp[i] = dp[i-1] + dp[i-2]

边界条件设置dp[0] = 1, dp[1] = 1
由于每次计算只用到了第i-1阶和第i-2阶的数据,所以可以只设置三个变量来代替数组,从而降低空间复杂度。

代码

class Solution {
public:
    int climbStairs(int n) {
        int p = 0, q = 0, r = 1;
        for(int i = 1; i <= n; i++){
            p = q;
            q = r;
            r = p + q;
        }
        return r;
    }
};   

复杂度分析

  • 时间复杂度:循环执行了n次,每次花费常数的时间代价,故时间复杂度为O(n)。
  • 空间复杂度:只用了常数个变量作为辅助空间,故空间复杂度为O(1)。

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!