---
title: '121. Best Time to Buy and Sell Stock'
description: You are given an array prices where prices[i] is the price of a given stock on the i^th day
sidebar:
  label: 'Best Time to Buy and Sell Stock'
  badge: 'Easy'
---

Array

### Example 1:
- Input: `prices = [7,1,5,3,6,4]`
- Output: `5`
- Explanation: Buy on day `2` (price = `1`) and sell on day `5` (price = `6`), profit = `6-1 = 5`. Note that buying on day `2` and selling on day `1` is not allowed because you must buy before you sell.

### Example 2:
- Input: `prices = [7,6,4,3,1]`
- Output: `0`
- Explanation: In this case, no transactions are done and the max profit = `0`.

### Constraints:

- `1 <= prices.length <= 10^5`
- `0 <= prices[i] <= 10^4`

## Approach

::::warning
The diagram traces the code below literally. That code does not run: `curr` and `ans` are never initialised, so the first `curr > left` test raises `NameError`, and `left` holds a price rather than an index, so `prices[left]` indexes by value.
::::

```mermaid
flowchart TD
  S(["maxProfit(prices)"]) --> I["left = min(prices)"]
  I --> F{"more right in range(len(prices))?"}
  F -- no --> E(["return ans"])
  F -- yes --> W{"curr > left?"}
  W -- yes --> P["curr -= prices[left]; left += 1"]
  P --> W
  W -- no --> M["ans = max(ans, curr)"]
  M --> F
```

## Solution

```py
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        left = min(prices)
        for right in range(len(prices)):
            while curr > left:
                curr -= prices[left]
                left += 1
            ans = max(ans, curr)
        return ans
```

## Explanation

[Sliding Window: Best Time to Buy and Sell Stock - Leetcode 121 - Python](https://www.youtube.com/watch?v=1pkOgXD63yU)
