--- 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 icon: dot topics: - { name: "Array", slug: "array" } - { name: "Dynamic Programming", slug: "dynamic-programming" } video: "1pkOgXD63yU" issue: "https://github.com/prdlk/leetcode/issues/50" sidebar: label: 'Best Time to Buy and Sell Stock' badge: 'Easy' --- ### 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 ```