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!

相关推荐

  1. LeetCode笔记第746:使用最小花费楼梯

    2024-05-16 10:32:05       37 阅读
  2. [ LeetCode ] 刷刷(Python)-第70楼梯

    2024-05-16 10:32:05       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-16 10:32:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-16 10:32:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-16 10:32:05       87 阅读
  4. Python语言-面向对象

    2024-05-16 10:32:05       96 阅读

热门阅读

  1. 英特尔处理器-----ERMS

    2024-05-16 10:32:05       29 阅读
  2. 科林算法_4 基础算法

    2024-05-16 10:32:05       26 阅读
  3. electron 使用两个页面(额外添加一个html文件)

    2024-05-16 10:32:05       36 阅读
  4. Log4j2滚动策略深度解析:保持日志轻量高效

    2024-05-16 10:32:05       24 阅读
  5. fastapi+vue实现导入Excel表格的功能

    2024-05-16 10:32:05       41 阅读
  6. 编译gdb:在x86虚拟机上,加载分析arm程序及崩溃

    2024-05-16 10:32:05       37 阅读
  7. 贪吃蛇(C++)

    2024-05-16 10:32:05       38 阅读
  8. C#数据库密码加密保存和登录验证方法

    2024-05-16 10:32:05       30 阅读