Skip to main content

123. Best Time to Buy and Sell Stock III

/*
* @lc app=leetcode id=123 lang=cpp
*
* [123] Best Time to Buy and Sell Stock III
*
* https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/description/
*
* algorithms
* Hard (49.51%)
* Likes: 9913
* Dislikes: 201
* Total Accepted: 705K
* Total Submissions: 1.4M
* Testcase Example: '[3,3,5,0,0,3,1,4]'
*
* You are given an array prices where prices[i] is the price of a given stock
* on the i^th day.
*
* Find the maximum profit you can achieve. You may complete at most two
* transactions.
*
* Note: You may not engage in multiple transactions simultaneously (i.e., you
* must sell the stock before you buy again).
*
*
* Example 1:
*
*
* Input: prices = [3,3,5,0,0,3,1,4]
* Output: 6
* Explanation: Buy on day 4 (price = 0) and sell on day 6 (price = 3), profit
* = 3-0 = 3.
* Then buy on day 7 (price = 1) and sell on day 8 (price = 4), profit = 4-1 =
* 3.
*
* Example 2:
*
*
* Input: prices = [1,2,3,4,5]
* Output: 4
* Explanation: Buy on day 1 (price = 1) and sell on day 5 (price = 5), profit
* = 5-1 = 4.
* Note that you cannot buy on day 1, buy on day 2 and sell them later, as you
* are engaging multiple transactions at the same time. You must sell before
* buying again.
*
*
* Example 3:
*
*
* Input: prices = [7,6,4,3,1]
* Output: 0
* Explanation: In this case, no transaction is done, i.e. max profit = 0.
*
*
*
* Constraints:
*
*
* 1 <= prices.length <= 10^5
* 0 <= prices[i] <= 10^5
*
*
*/

// @lc code=start
class Solution {
public:
int maxProfit(vector<int>& prices)
{
int t1minCost = INT_MAX, t2minCost = INT_MAX;
int t1maxProfit = 0, t2maxProfit = 0;

for (int price : prices)
{
t1minCost = min(t1minCost, price);
t1maxProfit = max(t1maxProfit, price - t1minCost);
t2minCost = min(t2minCost, price - t1maxProfit);
t2maxProfit = max(t2maxProfit, price - t2minCost);
}
return t2maxProfit;
}
};
// @lc code=end
  • T: O(n)O(n)
  • S: O(1)O(1)