zoukankan      html  css  js  c++  java
  • 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);
        }
    };
  • 相关阅读:
    stl测试
    noip2017逛公园
    比赛
    莫队算法
    noi.ac 第五场第六场
    重排DL
    bzoj2870
    异象石(就是sdio宝藏那题)
    Genius ACM
    模板复习
  • 原文地址:https://www.cnblogs.com/dilthey/p/10775607.html
Copyright © 2011-2022 走看看