Leetcode - Best Time to Buy and Sell Stock

针对股票交易场景,本文介绍了一种寻找最大利润的算法。该算法通过动态规划思想,在一系列股票价格中找到最低买入价与最高卖出价之间的最大差值,从而计算出最大可能利润。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Question

Say you have an array for which the ith element is the price of a given stock on day i.

If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit.


Java Code

public int maxProfit2(int[] prices) {
    int len = prices.length;
    if(len < 2) return 0;

    int max = 0;
    int buy = prices[0];
    int[] maxEarning = new int[len];
    maxEarning[0] = 0;

    for(int i = 1; i < len; ++i) {
        //计算当前天卖出股票的收益,并比较得到全局的最大收益max
        if((maxEarning[i] = prices[i] - buy) > max)
            max = maxEarning[i];

        //更新股票的历史最低报价,作为买入的价格buy
        if(prices[i] < buy)
            buy = prices[i];
    }

    return max;
}

说明

  • 本题看似是一个很简单的问题,本质上就是求价格曲线的极大值与极小值之差,且要求极大值必须出现在极小值之后,即股票以最低价买入最高价卖出所得的收益才是最大,但是这里股票价格是一系列离散的点,无法用连续函数的导数求出极值,只能逐个点进行比较。如果使用动态规划的思想来解决这个问题就显得比较容易了,其状态转移关系是,当前天的收益等于当天的股票报价减去历史最低报价,所以只需要一直更新历史最低报价就行,则股票的全局最大收益就是所有天收益中的最大值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值