一、题目描述
给定一个整数数组 prices
,其中第 prices[i]
表示第 i
天的股票价格。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
- 卖出股票后,你无法在第二天买入股票 (即冷冻期为
1
天)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: prices = [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
示例 2:
输入: prices = [1]
输出: 0
二、题解
通过动态规划求解,时间复杂度和空间复杂度均为 O ( n ) O(n) O(n)。
动态规划数组的状态转移过程:
{ 状态一(买入或保持买入) { 1. 保持前一天的买入 2. 在前一天保持卖出的基础上买入 3. 在前一天冷冻期的基础上买入 状态二(卖出):保持前一天的买入 状态三(保持卖出) { 1. 保持前一天的卖出 2. 保持前一天的保持卖出 状态四(冷冻期):前一天买入 \begin{cases} 状态一(买入或保持买入) \begin{cases} 1.保持前一天的买入\\ 2.在前一天保持卖出的基础上买入\\ 3.在前一天冷冻期的基础上买入 \end{cases}\\ 状态二(卖出):保持前一天的买入\\ 状态三(保持卖出) \begin{cases} 1.保持前一天的卖出\\ 2.保持前一天的保持卖出 \end{cases}\\ 状态四(冷冻期):前一天买入 \end{cases} ⎩ ⎨ ⎧状态一(买入或保持买入)⎩ ⎨ ⎧1.保持前一天的买入2.在前一天保持卖出的基础上买入3.在前一天冷冻期的基础上买入状态二(卖出):保持前一天的买入状态三(保持卖出){1.保持前一天的卖出2.保持前一天的保持卖出状态四(冷冻期):前一天买入
#include "code.h"
class Solution {
public:
int maxProfit(vector<int> &prices) {
// records.at(i).at(0)表示买入或保持买入
// records.at(i).at(1)表示卖出
// records.at(i).at(2)表示保持卖出
// records.at(i).at(3)表示冷冻期
vector<vector<int>> records(prices.size(), vector<int>(4));
records.at(0).at(0) = -prices.at(0);
records.at(0).at(1) = 0;
records.at(0).at(2) = 0;
records.at(0).at(3) = 0;
for (int i = 1; i < prices.size(); i++) {
records.at(i).at(0) = max(records.at(i - 1).at(0),
max(records.at(i - 1).at(2),
records.at(i - 1).at(3)) - prices.at(i));
records.at(i).at(1) = prices.at(i) + records.at(i - 1).at(0);
records.at(i).at(2) = max(records.at(i - 1).at(3), records.at(i - 1).at(2));
records.at(i).at(3) = records.at(i - 1).at(1);
}
return max(records.at(records.size() - 1).at(1),
max(records.at(records.size() - 1).at(2),
records.at(records.size() - 1).at(3)));
}
};