Java 60. 爬楼梯(LeetCode)

来自力扣的一道简单算法题

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

点击进入原题地址为:爬楼梯

解题思路(我个人的解题思路,可能会有些错误的地方,请见谅):
通过简短计算,我们可以知道

1 个台阶,有 1 种方法

2 个台阶,有 2 种方法

3 个台阶,有 3 种方法

4 个台阶,有 5 种方法

5 个台阶,有 8 种方法

6 个台阶,有 13 种方法

. . . . . . . . .

1,2,3,5,8,13 ....

如果有对这段数字很敏感的人,可能已经反应过来了,这就是斐波那契数列

斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89 . . .. 

这个数列从第3项开始,每一项都等于前两项之和。

当:a_{1} = 1, a_{2} = 1,a_{n} = a_{n-1} + a_{n-2} , (n >= 2, n \epsilon N^{*})

则通项公式为:a_{n} = \frac{1}{\sqrt{5}} [(\frac{1+\sqrt{5}}{2})^{n}-(\frac{1-\sqrt{5}}{2})^{n}]

根据定义,我们可以有两种方法来做这题

1. 公式法

n 的值为:                     1,2,3,4,5,6,7 . . . . 

题目是算出的数列:      1,2,3,5,8,13 . . . . 

斐波那契数列:       1,1,2,3,5,8,13,21,34,55,89 . . . .

因为n是从1开始的,得将  n  加上 1

代码如下 :

public static int climbStairs(int n) {
    n++;
    double count = 1 / Math.sqrt(5) * (Math.pow((1 + Math.sqrt(5)) / 2, n) - Math.pow((1 - Math.sqrt(5)) / 2, n));
    return (int) count;
}

2. 循环求和法

通过定义:数列从第3项开始,每一项都等于前两项之和。

我们可以这样写

代码如下:

public static int climbStairs(int n) {
    // 0 1 2 3 4 5 6  7  8  ....
    // 1 1 2 3 5 8 13 21 34 ....
    // 当索引大于1的时候,也就是大于等于2的时候,前两个楼梯数量的方法种数的和等于当前楼梯数量的方法种数。即 V(n-2) + V(n-1) = V(n)
    if (n > 1) {
        int a = 1; // 存储 V(n-2)
        int b = 1; // 存储 V(n-1)
        int c = 0; // c的初始值无所谓,用来存储值的 V(n)
        for (int i = 1; i < n; i++) {
            c = a + b; // c 便是第n阶楼梯对应的方法种数
            a = b;
            b = c;
        }
        return c;
    }
        return n;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值