剑指 offer day8

这篇博客探讨了两个经典的递归与动态规划问题:斐波那契数列和青蛙跳台阶。通过斐波那契数列的解题思路,展示了如何使用滑动窗口技巧优化计算;青蛙跳台阶问题同样利用了类似的方法,通过迭代计算出不同台阶的跳法数量。最后,介绍了如何找到股票交易的最大利润,通过遍历价格数组并维护最小成本和当前最大利润。这些问题都体现了计算机科学中的高效算法思想。
摘要由CSDN通过智能技术生成

剑指 Offer 10- I. 斐波那契数列

题目:

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1。
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

思路:

类似于固定长度的滑动窗口,具体实现如下图所示。

请添加图片描述

    public int fib(int n) {
        if (n<2){
            return n;
        }
        int p=0,q=0,r=1;
        for (int i = 0;i<=n-2;i++){
            p=q;
            q=r;
            r=(p+q)%1000000007;
        }
        return r;
    }

剑指 Offer 10- II. 青蛙跳台阶问题

题目:

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

题解:

设跳上n级台阶有f(n)种跳法。在所有跳法中,青蛙的最后一步只有两种情况: 跳上 1级或 2 级台阶。
当为1级台阶: 剩 n-1个台阶,此情况共有 f(n−1) 种跳法;
当为2级台阶: 剩 n-2个台阶,此情况共有 f(n-2)种跳法;
因此 f(n)=f(n-1)+f(n-2)

解题思路类似于上述的斐波那契数列

  public int numWays(int n) {
        if (n<2){
            return 1;
        }
        int p,q=1,r=1;
        for (int i=0;i<=n-2;i++){
            p=q;
            q=r;
            r=(p+q)%1000000007;
        }
        return r;
    }

剑指 Offer 63. 股票的最大利润

题目:

假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?

题解:

通过遍历prices数组:

  • 不断选取最小值来更新cost值;
  • 在当前位置判断此时price-costprofit之间的大小,更新profit为二者最小值
 public int maxProfit(int[] prices) {
        int cost = Integer.MAX_VALUE, profit = 0;
        for(int price : prices) {
            cost = Math.min(cost, price);
            profit = Math.max(profit, price - cost);
        }
        return profit;
    }

无论人生上到哪一层台阶,阶下有人在仰望你,阶上亦有人在俯视你
晚安!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值