目录

要求
力扣第121题
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

思路
目标是:在最低价买入,最高价卖出,且卖出必须在买入之后。
核心逻辑
- 遍历每一天的价格
- 记录到当前为止的最低价格(作为可能的买入点)
- 计算如果今天卖出,能获得的最大利润 = 今天价格 - 历史最低价
- 不断更新最大利润
Code
javascript
var maxProfit = function(prices) {
let res = 0; // 最大利润,初始为0(不买卖)
let minPrice = prices[0]; // 初始化第一天为最低价
for (const p of prices) { // 遍历每一天的价格
res = Math.max(res, p - minPrice); // 计算今天卖出的利润,更新最大利润
minPrice = Math.min(minPrice, p); // 更新历史最低价
}
return res; // 返回最大利润
};
示例演示
假设 prices = [7, 1, 5, 3, 6, 4]
| 当前价格 | 历史最低价 | 当前利润(价格-最低) | 最大利润res |
|---|---|---|---|
| 7 | 7 | 0 | 0 |
| 1 | 1 | 0 | 0 |
| 5 | 1 | 4 | 4 |
| 3 | 1 | 2 | 4 |
| 6 | 1 | 5 | 5 |
| 4 | 1 | 3 | 5 |
结果:5(在第2天1元买入,第5天6元卖出)
关键点
- 时间复杂度:O(n),只遍历一次
- 空间复杂度:O(1),只用了常数空间
- res 初始为0,保证如果价格一直下跌,不会亏本(选择不买卖)
- 更新 minPrice 必须在计算利润之后,确保不会在同一天买卖