---
# System prepended metadata

title: 121. Best Time to Buy and Sell Stock
tags: [Leetcode]

---

# 121. Best Time to Buy and Sell Stock

**練習日期：** 2026-02-08
**難度：** Easy
**類型：** Array、Greedy

## 📘 題目敘述（原文翻譯）

給你一個陣列 `prices`，其中 `prices[i]` 表示第 `i` 天某支股票的價格。

你想要最大化你的利潤，方法是選擇**某一天買入**一股股票，並在**未來的某一天賣出**那一股股票。

請回傳你能獲得的最大利潤。如果你無法獲得任何利潤，則回傳 `0`。

### 條件限制（原文翻譯）

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

## 🧠 解題思路

我把這題想成一句話：

> 我今天如果要賣出，那我一定希望「之前買到的價格最低」。

所以我從左到右掃過去時，只要維護兩件事就夠了：

1. `best`：到目前為止看過的最低股價（代表最划算的買入點）
2. `ans`：到目前為止能得到的最大利潤

當我走到某一天價格 `i`：

* 我先更新 `best`：如果今天更便宜，就把 `best` 改成今天
* 然後把今天當作「賣出日」，看看 `i - best` 這個利潤能不能更新 `ans`

這樣每一天都在做「如果我今天賣，最佳買入價是什麼」的計算，整體一次掃描就能得到最大利潤。

### 所有變數

* `prices`：題目輸入的股價陣列
* `best`：目前為止的最低價格（最便宜的買入點）
* `ans`：目前為止的最大利潤

## 🪜 主要流程步驟

### 1. 初始化最低買入價與答案

* `best` 先設成非常大（`INT_MAX`），代表還沒看過任何價格
* `ans` 初始化為 `0`，代表最差情況就是不交易

### 2. 從左到右掃描每一天價格

每讀到一天的價格 `i`：

* 如果 `i < best`，代表找到更低的買入價，更新 `best = i`
* 用今天當賣出日，計算利潤 `i - best`，並更新 `ans = max(ans, i - best)`

### 3. 回傳最大利潤

掃描完後 `ans` 就是最大可能利潤（若沒辦法賺錢則保持 0）。

## 💻 程式碼實作

```cpp
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int best = INT_MAX;
        int ans = 0;
        for (int i : prices) {
            if (i < best) {
                best = i;
            }
            ans = max(ans, i - best);
        }
        return ans;
    }
};
```

## 🔗 題目連結

[https://leetcode.com/problems/best-time-to-buy-and-sell-stock/description/](https://leetcode.com/problems/best-time-to-buy-and-sell-stock/description/)
