Day08_剑指Offer

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;
    }
}
上一篇:do {...} while (0) 在宏定义中的作用


下一篇:查询已取消,因为此查询的估计开销 (%d) 出了配置的阈值 %d” (转)