LeetCode 70 - 爬楼梯 - [递推+滚动优化]

Posted dilthey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 70 - 爬楼梯 - [递推+滚动优化]相关的知识,希望对你有一定的参考价值。

假设你正在爬楼梯。需要 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 阶

 

设 $f[n]$ 表示跳上 $n$ 级台阶的方案数目,因此很容易得到 $f[n] = f[n-1] + f[n-2]$,这就是一个斐波那契数列。

我们可以用递推的方法 $O(n)$ 求出斐波那契数列求出第 $n$ 项,然后由于每次递推只涉及到三个变量,所以我们用滚动优化的方式使得空间复杂度变成 $O(1)$。

 

AC代码:

class Solution
{
public:
    int climbStairs(int n)
    {
        if(n<=3) return n;
        int a[3]={1,1,2};
        for(int i=3;i<=n;i++) a[i%3]=a[(i+1)%3]+a[(i+2)%3];
        return a[n%3];
    }
};

 

当然,我们知道斐波那契数列是由通项公式的,我们可以用通项公式 $O(1)$ 地求第 $n$ 项,当然需要注意一下double类型转成int类型时候的一些精度上的小问题。

 

AC代码:

inline int fibo(int n)
{
    double res=1.0/sqrt(5);
    res*=pow((1.0+sqrt(5))/2.0,n)-pow((1.0-sqrt(5))/2.0,n);
    return (int)(res+1e-10);
}

class Solution
{
public:
    int climbStairs(int n)
    {
        return fibo(n+1);
    }
};

 

以上是关于LeetCode 70 - 爬楼梯 - [递推+滚动优化]的主要内容,如果未能解决你的问题,请参考以下文章

[每日一题2020.06.14]leetcode #70 爬楼梯 斐波那契数列 记忆化搜索 递推通项公式

LeetCode70.爬楼梯

[LeetCode] 70. 爬楼梯

「动态规划」LeetCode 70(爬楼梯)

leetcode70爬楼梯

LeetCode70——爬楼梯