力扣 爬楼梯问题

前言

问题链接

一、详解

解法一 通项公式

这种题目是典型的斐波那契问题,可以看百度百科的斐波那契数列,百度百科上也给出了斐波那契数列的通项公式:
通项公式
由此可以引出第一种解法。这里参考力扣的题解,画解算法:70. 爬楼梯,也感谢作者的无私奉献。

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

解法二 动态规划

这里直接写解法,详细的可以看上面的题解,不得不说,上面的是真大神。

public int climbStairs(int n) {
        int[] dp = new int[n + 1];
        dp[0] = 1;
        dp[1] = 1;
        for(int i = 2; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }

这个解法的问题在于空间复杂度较高,下面给出力扣国际站上的最高票解法。

解法三 优化空间复杂度

Basically it’s a fibonacci.

public int climbStairs(int n) {
    // base cases
    if(n <= 0) return 0;
    if(n == 1) return 1;
    if(n == 2) return 2;
    
    int one_step_before = 2;
    int two_steps_before = 1;
    int all_ways = 0;
    
    for(int i=2; i<n; i++){
    	all_ways = one_step_before + two_steps_before;
    	two_steps_before = one_step_before;
        one_step_before = all_ways;
    }
    return all_ways;
}

可以看到只用了三个变量来回赋值,解决了空间复杂度的问题

总结

近些年,国内的程序员越来越注重算法的联系,我觉得一方面这虽然是因为想进入大厂,必须准备算法,另一方面,也是一个国家软件行业成熟的表现,不只是考虑软件的实现,更多是对软件思维的考量和软件性能的优化,所以算法已经是程序员的必修课了,如果程序员不注重算法,那么感觉还是有些危险的,加油!

参考

  1. 斐波那契数列
  2. 画解算法:70. 爬楼梯
  3. Basically it’s a fibonacci.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值