剑指Offer8

31 篇文章 0 订阅
4 篇文章 0 订阅
这篇博客探讨了三个使用动态规划解决的计算机科学问题:斐波那契数列的计算、青蛙跳台阶问题的求解以及寻找股票一次交易的最大利润。每道题目都通过动态规划数组来存储中间结果并避免重复计算,最终求得答案。所有结果均考虑了模1e9+7的取模操作,确保结果在给定范围内。
摘要由CSDN通过智能技术生成
剑指Offer第八天

动态规划,这天都是很简单的题。。
在这里插入图片描述

题1:斐波那契数列

写一个函数,输入 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。

在这里插入图片描述

class Solution {
    public int fib(int n) {
        if(n==0){return 0;}
        int[] dp = new int[n+1];
        dp[1] = 1;
        for(int i = 2; i <= n; i++){
            dp[i] = (dp[i-1] + dp[i-2]) % 1000000007;
        }
        return dp[n];
    }
}

在这里插入图片描述

题2:青蛙跳台阶问题

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

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

在这里插入图片描述

/**
* 青蛙如果想要到台阶四,只有两个方法能到
* 1:从第三个台阶跳一步上去 dp[n] 取决于dp[n-1]
* 2: 从第二个台阶跳两格上去 dp[n] 也取决于dp[n-2]
* 所以关系就是,你不知道青蛙咋跳的,都有可能就取和
* dp[n] = dp[n-1] + dp[n-2]
* 斐波那契换个说法。。。
**/
class Solution {
    public int numWays(int n) {
        if(n==0){return 1;}
        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]) % 1000000007;
        }
        return dp[n];
    }
}

在这里插入图片描述

题3:股票的最大利润

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

在这里插入图片描述

class Solution {
    public int maxProfit(int[] prices) {
        //只能买卖一次,所以
        int length = prices.length;
        //minValue找出数组的最小值
        int minValue = Integer.MAX_VALUE;
        //maxPro输出的利润值
        int maxPro = 0;
        for(int i = 0; i < length; i++){
            //利润就是当前价格减去最低价格
            //如果理论大于迄今的最大理论,就替换,否则就不变
            maxPro = (prices[i] - minValue) > maxPro ? (prices[i] - minValue):maxPro;
            //更新最低价格
            minValue = Math.min(prices[i], minValue);
        }
        return maxPro;
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值