题目分析:
用一个数组表示股票每天的价格,数组中第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; } };