力扣 123. 买卖股票的最佳时机 III

一、题目描述

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

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

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

示例 1
输入:prices = [3,3,5,0,0,3,1,4]
输出:6
解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3。随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3。
     
示例 2:
输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4。注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
     
示例 3:
输入:prices = [7,6,4,3,1] 
输出:0 
解释:在这个情况下, 没有交易完成, 所以最大利润为 0。

示例 4:
输入:prices = [1]
输出:0

二、题解

通过动态规划求解,时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 4 n ) O(4n) O(4n)

class Solution {
public:
    int maxProfit(vector<int> &prices) {
        // records.at(i).at(0)表示第i天 进行第一股买入或维持前一天第一股已买入状态时 手中所持有的最大现金
        // records.at(i).at(1)表示第i天 进行第一股卖出或维持前一天第一股已卖出状态时 手中所持有的最大现金
        // records.at(i).at(2)表示第i天 进行第二股买入或维持前一天第二股已买入状态时 手中所持有的最大现金
        // records.at(i).at(3)表示第i天 进行第二股卖出或维持前一天第二股已卖出状态时 手中所持有的最大现金
        vector<vector<int>> dp(prices.size(), vector<int>(4, 0));


        /* 动态规划矩阵初始化 */
        dp.at(0).at(0) = -prices.at(0); // 进行一次买入 -
        dp.at(0).at(1) = 0; // 进行一次买入卖出 - +
        dp.at(0).at(2) = -prices.at(0); // 进行一次买入卖出后再买入 - + -
        dp.at(0).at(3) = 0; // 进行一次买入卖出后再买入卖出 - + - +

        /* 从上到下从左到右递推 */
        for (int i = 1; i < prices.size(); i++) {
            // 在前一天一股没买的基础上买入第一股 或 维持前一天的第一股已买入的状态
            dp.at(i).at(0) = max(-prices.at(i), dp.at(i - 1).at(0));

            // 在前一天已买入第一股的基础上卖出第一股 或 维持前一天的第一股已卖出的状态
            dp.at(i).at(1) = max(dp.at(i - 1).at(0) + prices.at(i), dp.at(i - 1).at(1));

            // 在前一天已卖出第一股的基础上买入第二股 或 维持前一天的第二股已买入的状态
            dp.at(i).at(2) = max(dp.at(i - 1).at(1) - prices.at(i), dp.at(i - 1).at(2));

            // 在前一天已买入第二股的基础上卖出第二股 或 维持前一天的第二股已卖出的状态
            dp.at(i).at(3) = max(dp.at(i - 1).at(2) + prices.at(i), dp.at(i - 1).at(3));
        }

        return dp.at(dp.size() - 1).at(3);
    }
};

动态规划数组示例:

0 1 2 3
3 -3 0 -3 0
3 -3 0 -3 0
5 -3 2 -3 2
0 0 2 2 2
0 0 2 2 2
3 0 3 2 5
1 0 3 2 5
4 0 4 2 6

在这里插入图片描述

你可能感兴趣的:(数据结构与算法,leetcode,算法,职场和发展)