题目分析:
用一个数组表示股票每天的价格,数组中第i个数表示股票在第i天的价格。最多只能交易两次,且手上最多能持有一支股票,求最大收益。
解题思路:动态规划求解
假设以第i(0 <= i <= n-1)填为中间卖出也即下次交易的买入,则最大收益为max{preprofit[i] + postprofit[i]}。具体实现分三步:
1)从前到后遍历,求第一次交易的最大值;
2)从后向前遍历,求第二次交易的最大值;
3)从前向后遍历,计算两次交易的最大值。
实现程序
class Solution { public: int maxProfit(vector<int> &prices) { // 计算股票变化天数 int size = prices.size(); if (size == 0) return 0; // 用于存放第一次交易的最大收益 vector<int> f1(size); // 用于存放后第二次交易的最大收益 vector<int> f2(size); // 从前到后计算第一次交易的最大值 int minV = prices[0]; for (int i = 1; i < size; i++) { minV = min(minV, prices[i]); f1[i] = max(f1[i - 1], prices[i] - minV); } // 从向前计算第二次交易的最大值 int maxV = prices[size - 1]; f2[size - 1] = 0; for (int i = size - 2; i >= 0; i--) { maxV = max(maxV, prices[i]); f2[i] = max(f2[i + 1], maxV - prices[i]); } // 计算两次交易中的最大值 int sum = 0; for (int i = 0; i < size; i++) sum = max(sum, f1[i] + f2[i]); // 返回最大收益 return sum; } };

本文介绍了一种利用动态规划求解股票交易中两次买卖的最大利润问题的方法。通过三次遍历,分别从前向后计算第一次交易的最大收益,从后向前计算第二次交易的最大收益,最后从前向后遍历计算两次交易的最大收益。
1万+

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



