121. Best Time to Buy and Sell Stock

本文详细解析了三种求解股票买卖最大利润的算法,包括记录最小值和最大利润的遍历法、优化后的最小价值记录法及采用Kadane's Algorithm的连续子串最大和思想。适用于初学者理解并掌握股票交易利润计算的基本算法。

一、题目

  1、审题

  2、分析

    给出一个数组,让你先已 val1 买入,再 以 val2 卖出,求获得的利润最大是多少。

 

 二、解答

  1、思路: 

    方法一、

      用遍历 min 记录到当前位置的最小值;

      max 记录到当前数组值的价格卖出为止时获得的最大利润。

    public int maxProfit(int[] prices) {
        if(prices.length < 2)
            return 0;
        int min = prices[0];
        int max = 0;
        for (int i = 1; i < prices.length; i++) {
            if(prices[i] - min > 0 && prices[i] - min > max) {
                max = prices[i] - min; 
            }
            else if(prices[i] < min)
                min = prices[i];
        }
        return max;
    }

  

  优化:

    变量 minPrice 直接记录当前的最小价值。

    public int maxProfit3(int[] prices) {
        
        int minprice = Integer.MAX_VALUE, max = 0;
        for (int i = 1; i < prices.length; i++) {
            minprice = Math.min(minprice, prices[i]);
            max = Math.max(max, prices[i] - minprice);
        }
        return max;
    }

 

  方法二、

    采用 “Kadane's Algorithm.”,即采用求连续子串最大和的思想。

    curMax: 以当前价格卖出时获得的利润(若不赚钱就不卖出)。

      ①、若 curMax = 0, 即代表当前值比前边的值都小;

      ②、若 curMax > 0,即, curMax = (price[i-1] - price[i - 2] + price[i] - price[i-1]) = price[i] - price[i-1]。即为 当前价格为最大值,且减去的是前边的最小值。

    max: 总的过程中的最大利润。

    public int maxProfit2(int[] prices) {
        
        int curMax = 0, max = 0;
        for (int i = 1; i < prices.length; i++) {
            curMax = Math.max(0, curMax += prices[i] - prices[i-1]);
            max = Math.max(curMax, max);
        }
        return max;
    }

 

转载于:https://www.cnblogs.com/skillking/p/9748895.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值