力扣刷题-买卖股票的最佳时机III

本文介绍了如何使用动态规划解决力扣中一个关于股票交易的问题,允许进行两次交易。核心思路是维护第一次交易的最大利润和两次交易的总利润,通过遍历价格数组,动态更新这两个值。代码简洁,但对第二次交易利润的维护需要深入理解。

题目来自力扣,算是股票买卖里面比较困难的一题,但是解法却不复杂。

这里给出题目:

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

很容易想到

这里需要动态规划两次买卖股票的利润,维护第一次的最大值和两次加和后的最大值

也就是说:需要动态维护两个值,一个是第一次交易的利润,一个是两次利润的和

参数选择方面,中规中矩,对于两个buy的初始化为数组第一个元素,作为动态规划的起点

    int buy1 = prices[0], profit1 = 0;
    int buy2 = prices[0], profit2 = 0;

对于第一次交易的利润,比较简单的动态规划维护最大值

buy1 = fmin(buy1, prices[i]);             // 寻找最低点买入  
profit1 = fmax(profit1, prices[i]-buy1);  // 找到第一次交易的最大盈利,并不断维护这一最大值 

对于的二次交易:寻找第二次交易的最低投资点,并且考虑前一次交易的成本

这样一来,就可以直接维护总利润的最大值

这里从某种意义上假设了当天卖出后就买入,但对结果没有影响 

// 当前价格 - 第一次操作的盈利=新的投入成本的负数(为了让盈利最大,要寻找最小的成本)
buy2 = fmin(buy2, prices[i]-profit1);       
// 第二次卖出后的盈利:当前价格减去成本,得到两次交易的总利润,并不断维护这一最大的总利润  
profit2 = fmax(profit2, prices[i]-buy2);

总的代码放在这里:

看上去四行加一个遍历,但是对于第二次交易以及总利润的维护却比较难以理解

如有错误,望各位大佬斧正!

int maxProfit(int* prices, int pricesSize) 
{
    int buy1 = prices[0], profit1 = 0;
    int buy2 = prices[0], profit2 = 0;
    for (int i = 1; i < pricesSize; ++i) 
	{
        buy1 = fmin(buy1, prices[i]); 
        profit1 = fmax(profit1, prices[i]-buy1);
        buy2 = fmin(buy2, prices[i]-profit1);    
        profit2 = fmax(profit2, prices[i]-buy2);
    }
    return profit2;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值