LeetCode刷题之爬楼梯

2024/5/15 这几天天气倍儿棒!我胡汉三又回来啦!元气满满嘿嘿嘿,昨晚做梦,梦了一晚上代码bug,报错,timeout。气死我啦!我是打不死滴,做题做题!

1、题目描述

在这里插入图片描述

2、逻辑思考

看到这个题,我的脑海里闪现了两个概念:阶乘和排列组合。那么怎么个逻辑方法呢?怎么把它整出来呢?我不会,看题解再回来,等我。题解给出了三种解题方法,分别为:动态规划、矩阵快速幂以及通项公式。那么我们先从动态规划开始吧。

动态规划:我的理解就是:归纳演绎,总结出规律,比如一次性只能走1个台阶或2个台阶。那么我们试想最后一步,要么是走1个台阶,要么就是走2个台阶,就可以得出基本公式:

在这里插入图片描述

再进行验证,发现f(0)=1,f(1) = 1,f(2) = 2,f(3) = 3 ,f(5) = 5 …和公式相符,故逻辑成立。

3、代码演示

public int climbStairs(int n) {
        int a = 0 ,b = 0, c = 1;
        for(int i= 0 ; i < n ; i++){
            a = b;
            b = c;
            c = a + b;
        }
        return c;
    }

时间复杂度:O(n),空间复杂度:O(1)。

那么,接下来我们先跳过矩阵快速幂,直接来到通项公式这一解法。这是一个计算斐波那契数列第n项的高效算法,但它不是直接通过递归或迭代来计算,而是利用了斐波那契数列的通项公式。

在这里插入图片描述

思路如上所述,直接开始代码了。

public int climbStairs(int n) {
         // 计算根号5的值,因为斐波那契数列的通项公式中涉及到根号5 
       double sqrt5 = Math.sqrt(5);
       // 使用斐波那契数列的通项公式来计算第n项的值  
       double finb = Math.pow((1 + sqrt5) / 2 , n + 1 )- Math.pow((1 - sqrt5) / 2 , n + 1);
       // 因为fibn是一个double类型的值,但我们需要一个整数结果,故强转
       return (int) Math.round(finb / sqrt5);
    }

我还看到一个好玩儿的解法,给大家看看:

int climbStairs(int n){
    int result = 0;
    switch(n){
    case 1: result = 1; break;
    case 2: result = 2; break;
    case 3: result = 3; break;
    case 4: result = 5; break;
    case 5: result = 8; break;
    case 6: result = 13; break;
    case 7: result = 21; break;
    case 8: result = 34; break;
    case 9: result = 55; break;
    case 10: result = 89; break;
    case 11: result = 144; break;
    case 12: result = 233; break;
    case 13: result = 377; break;
    case 14: result = 610; break;
    case 15: result = 987; break;
    case 16: result = 1597; break;
    case 17: result = 2584; break;
    case 18: result = 4181; break;
    case 19: result = 6765; break;
    case 20: result = 10946; break;
    case 21: result = 17711; break;
    case 22: result = 28657; break;
    case 23: result = 46368; break;
    case 24: result = 75025; break;
    case 25: result = 121393; break;
    case 26: result = 196418; break;
    case 27: result = 317811; break;
    case 28: result = 514229; break;
    case 29: result = 832040; break;
    case 30: result = 1346269; break;
    case 31: result = 2178309; break;
    case 32: result = 3524578; break;
    case 33: result = 5702887; break;
    case 34: result = 9227465; break;
    case 35: result = 14930352; break;
    case 36: result = 24157817; break;
    case 37: result = 39088169; break;
    case 38: result = 63245986; break;
    case 39: result = 102334155; break;
    case 40: result = 165580141; break;
    case 41: result = 267914296; break;
    case 42: result = 433494437; break;
    case 43: result = 701408733; break;
    case 44: result = 1134903170; break;
    case 45: result = 1836311903; break;
    }
    return result;
}

哈哈哈哈哈哈哈,够粗暴,我喜欢。ok啦大家,我得做其他事情啦,BYE!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值