• Time:O(n)
• Space:O(1)

C++

``````class Solution {
public:
int maxProfit(vector<int>& prices) {
int sellTwo = 0;
int holdTwo = INT_MIN;
int sellOne = 0;
int holdOne = INT_MIN;

for (const int price : prices) {
sellTwo = max(sellTwo, holdTwo + price);
holdTwo = max(holdTwo, sellOne - price);
sellOne = max(sellOne, holdOne + price);
holdOne = max(holdOne, -price);
}

return sellTwo;
}
};
``````

JAVA

``````class Solution {
public int maxProfit(int[] prices) {
int sellTwo = 0;
int holdTwo = Integer.MIN_VALUE;
int sellOne = 0;
int holdOne = Integer.MIN_VALUE;

for (final int price : prices) {
sellTwo = Math.max(sellTwo, holdTwo + price);
holdTwo = Math.max(holdTwo, sellOne - price);
sellOne = Math.max(sellOne, holdOne + price);
holdOne = Math.max(holdOne, -price);
}

return sellTwo;
}
}
``````

Python

``````class Solution:
def maxProfit(self, prices: List[int]) -> int:
sellTwo = 0
holdTwo = -math.inf
sellOne = 0
holdOne = -math.inf

for price in prices:
sellTwo = max(sellTwo, holdTwo + price)
holdTwo = max(holdTwo, sellOne - price)
sellOne = max(sellOne, holdOne + price)
holdOne = max(holdOne, -price)

return sellTwo
``````