mirror of
https://github.com/prdlk/leetcode.git
synced 2026-11-02 13:12:44 +00:00
81 lines
2.9 KiB
Plaintext
81 lines
2.9 KiB
Plaintext
---
|
|
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"
|
|
companies:
|
|
- { name: "Bloomberg", period: "Thirty Days", frequency: 83.1 }
|
|
- { name: "Infosys", period: "Thirty Days", frequency: 80.2 }
|
|
- { name: "Amazon", period: "Thirty Days", frequency: 69.6 }
|
|
- { name: "Ola Cabs", period: "Thirty Days", frequency: 65.6 }
|
|
- { name: "Google", period: "Thirty Days", frequency: 65.3 }
|
|
- { name: "tcs", period: "Thirty Days", frequency: 58.2 }
|
|
- { name: "Atlassian", period: "Three Months", frequency: 100 }
|
|
- { name: "Media.net", period: "Three Months", frequency: 100 }
|
|
- { name: "Nvidia", period: "Three Months", frequency: 87.7 }
|
|
- { name: "Meta", period: "Three Months", frequency: 70.4 }
|
|
- { name: "Apple", period: "Three Months", frequency: 69 }
|
|
- { name: "Microsoft", period: "Three Months", frequency: 60.5 }
|
|
- { name: "Mastercard", period: "Six Months", frequency: 79 }
|
|
- { name: "Accenture", period: "Six Months", frequency: 75 }
|
|
- { name: "Adobe", period: "Six Months", frequency: 74.3 }
|
|
- { name: "Walmart Labs", period: "Six Months", frequency: 70.5 }
|
|
- { name: "IBM", period: "Six Months", frequency: 70.1 }
|
|
- { name: "TikTok", period: "Six Months", frequency: 55.2 }
|
|
- { name: "Goldman Sachs", period: "Six Months", frequency: 53.1 }
|
|
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
|
|
```
|