题目解析
题目要求计算 买卖股票的最大利润,假设你 只能买卖一次。
• prices[i] 表示第 i 天的股票价格。
• 你可以在 某一天买入股票,然后在 之后的某一天卖出,求最大收益。
• 不能卖空(也就是不能在买入前就卖出)。
思路解析
1. 维护两个变量
• cost:记录历史最低买入价格,初始化为 INT_MAX。
• profit:记录最大收益,初始化为 0。
2. 遍历价格数组
• 对于每一天的价格 price:
1. 更新最小买入成本:
• 如果当前价格 price 比 cost 还低,就更新 cost。
2. 计算当前卖出的最大收益:
• 计算当前收益 price - cost,并更新 profit。
3. 最终返回 profit
• profit 记录了整个遍历过程中能取得的最大收益。
代码解析
class Solution {
public:
int maxProfit(vector<int>& prices) {
int cost = INT_MAX; // 初始化最小买入成本
int profit = 0; // 初始化最大收益
for (auto &price : prices) { // 遍历所有价格
cost = min(cost, price); // 更新最低买入价格
profit = max(profit, price - cost); // 更新最大收益
}
return profit;
}
};
详细执行过程
假设输入:
vector<int> prices = {7, 1, 5, 3, 6, 4};
初始状态
变量 值
cost INT_MAX
profit 0
遍历 prices
天数 price cost = min(cost, price) profit = max(profit, price - cost)
1 7 min(INT_MAX, 7) = 7 max(0, 7 - 7) = 0
2 1 min(7, 1) = 1 max(0, 1 - 1) = 0
3 5 min(1, 5) = 1 max(0, 5 - 1) = 4
4 3 min(1, 3) = 1 max(4, 3 - 1) = 4
5 6 min(1, 6) = 1 max(4, 6 - 1) = 5
6 4 min(1, 4) = 1 max(5, 4 - 1) = 5
最终 profit = 5,即:
• 第 2 天(价格 1)买入,
• 第 5 天(价格 6)卖出,
• 最大利润 = 6 - 1 = 5。
时间复杂度 & 空间复杂度
• 时间复杂度:$O(n)$,只遍历一次数组。
• 空间复杂度:$O(1)$,只用了常数额外空间。
总结
• 通过 遍历数组,不断更新 最低买入价格 和 最大收益。
• 贪心算法:每次都假设当前价格是最优解,更新最优答案。
• 代码简单高效,适用于 只能买卖一次 的情况。