📘 題目敘述
給你一個整數陣列 prices,其中 prices[i] 表示某支股票在第 i 天的價格。
在每一天,你可以決定要不要買入和賣出這支股票。你最多同時只能持有一股股票。不過你可以在同一天買入並賣出。
請你找出你能得到的最大利潤。
條件限制
1 <= prices.length <= 3 * 10^40 <= 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/