Day08_剑指Offer
package com.sorrymaker.day3208;
/**
* 是个动态规划问题。
* 假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
* 示例:
* 输入: [7,1,5,3,6,4]
* 输出: 5
* 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
* 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
* @Author nextGame
* @Date 2021/8/19 20:37
* @Version 1.0
*/
public class MaxProfit {
public int maxProfit(int[] prices) {
//定义cost为无穷大,利润为0;
int cost =Integer.MAX_VALUE,profit=0;
//遍历价格数组
for(int price:prices){
//找出价格数组里面的最小值
cost = Math.min(cost,price);
//在价格数组里面,每天价格-最小值的利润中求出最大值。
profit = Math.max(profit,price-cost);
}
return profit;
}
}
package com.sorrymaker.day3208;
/**
* 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
* 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
* F(n ) = F(n-1) +F(n-2) ===>>> F(n+1) = F(n) + F(n-1)等价于 斐波那契数列,只不过起始数字不一样
* F(0)=1,F(1)=1,F(2)=2;
*
* @Author nextGame
* @Date 2021/8/19 20:31
* @Version 1.0
*/
public class NumWays {
public int numWays(int n) {
int a = 1, b = 1, sum = 0;
for (int i = 0; i < n; i++) {
sum = (a + b) % 1000000007;
a = b;
b = sum;
}
return a;
}
}
package com.sorrymaker.day3208;
/**
* 写一个函数,输入 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。
* @Author nextGame
* @Date 2021/8/19 20:26
* @Version 1.0
*/
public class Fib {
public int fib(int n) {
//F(N) = F(N-1)+F(N-2) ==>> F(n+1) = F(N) + F(N-1)
int a = 0 , b=1, sum = 0;
for(int i= 0;i<n;i++){
sum = (a+b)%1000000007;
a = b;
b = sum;
}
return a;
}
}