# LeetCode (Best Time to Buy and Sell Stock I, II, III, IV etc.)

This session includes the best time to buy and sell stock I, II, III, IV, with a cooldown, with a transaction fee.

## 1. Best Time to Buy and Sell Stock (Easy)

- Code:

` # Time O(N) Space O(1), runtime = 68 ms`

def maxProfit(self, prices: List[int]) -> int:

if not prices: return 0

bottom_price = float('inf')

max_profit = 0

for p in prices:

bottom_price = min(bottom_price, p)

max_profit = max(max_profit, p - bottom_price)

return max_profit

## 2. Best Time to Buy and Sell Stock II (Easy)

- Code:

` # Time O(N) Space O(1)`

def maxProfit(self, prices: List[int]) -> int:

if not prices: return 0

profit = 0

for i in range(1, len(prices)):

diff = prices[i] - prices[i-1]

if diff > 0:

profit += diff

return profit

## 3. Best Time to Buy and Sell Stock III (Hard)

- Code:

` # Time O(N) Space O(1), runtime = 72 ms`

def maxProfit(self, prices: List[int]) -> int:

if not prices: return 0

t1_price, t2_price = float('inf'), float('inf')

t1_max_profit, t2_max_profit = 0, 0

for p in prices:

t1_price = min(t1_price, p)

t1_max_profit = max(t1_max_profit, p - t1_price)

t2_price = min(t2_price, p - t1_max_profit)

t2_max_profit = max(t2_max_profit, p - t2_price)

return t2_max_profit

## 4. Best Time to Buy and Sell Stock IV (Hard)

- Code:

`(to be continued)`

## 5. Best Time to Buy and Sell Stock with Cooldown (Medium):

- Code:

# Time O(N) Space O(1)

def maxProfit(self, prices: List[int]) -> int:

if not prices: return 0

profits = [0] * len(prices)

max_diff = -prices[0]for i in range(1, len(prices)):

profits[i] = max(profits[i-1], prices[i] + max_diff)

cooldown = 0 if i - 2 < 0 else profits[i-2]

max_diff = max(max_diff, cooldown - prices[i])return profits[-1]

## 6. Best Time to Buy and Sell Stock with Transaction Fee (Medium)

- Code:

`(to be continued)`