122. Best Time to Buy and Sell Stock II

練習日期:2026-02-18

難度:Medium

類型:Array、Dynamic Programming、Greedy

📘 題目敘述

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

在每一天,你可以決定要不要買入和賣出這支股票。你最多同時只能持有一股股票。不過你可以在同一天買入並賣出。

請你找出你能得到的最大利潤。

條件限制

  • 1 <= prices.length <= 3 * 10^4
  • 0 <= prices[i] <= 10^4

🧠 解題思路

這題的重點在於:因為你可以做無限次交易,只要不重疊持股,那最好的策略其實就是把所有「連續上漲」的利潤都吃掉。

只要今天的價格比昨天高,那代表「昨天買、今天賣」一定是賺的,而且不會妨礙之後繼續交易。所以我就把每一段上漲的差值全部加起來,累積成答案。

在我的程式碼裡:

  • now 代表「昨天的價格」
  • 當遇到 i > now,我就把 i - now 加進 ans
  • 不管有沒有賺,我最後都把 now 更新成今天的價格,讓下一輪可以跟「今天」比

所有變數

  • now:上一天的股價(用來和今天比較)
  • ans:目前累積的最大利潤

🪜 主要流程步驟

1. 初始化 now 與 ans

ans 一開始是 0,代表目前沒有任何獲利。now 先設成 INT_MAX,用意是讓第一天不會被當成「上漲」而加到利潤。

2. 依序掃過每天價格,把上漲差值累加

對每一天的價格 i

如果 now < i,代表今天比昨天貴:我就把 (i - now) 加進 ans,等價於做一筆「昨天買、今天賣」的交易。

3. 更新 now 為今天價格

每一輪最後都做 now = i,讓下一天可以拿今天當「昨天」比較。

4. 回傳累積答案

掃完所有天數後,ans 就是把所有上漲段落都吃掉的最大總利潤。

⏱️ 複雜度

  • 時間複雜度:O(n),掃一次 prices
  • 空間複雜度:O(1)

💻 程式碼實作

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int now = INT_MAX;
        int ans = 0;
        for (int i : prices) {
            if (now < i) {
                ans = ans + (i - now);
            }
            now = i;
        }
        return ans;
    }
};

https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/

作者: scottnick
撰寫日期: 2026-02-18
類別:
原文連結: https://scottnick.github.io/cpp-notes/all%20problems/122-best-time-to-buy-and-sell-stock-ii.html