题目来自力扣,算是股票买卖里面比较困难的一题,但是解法却不复杂。
这里给出题目:
给定一个数组,它的第 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;
}

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

被折叠的 条评论
为什么被折叠?



