121. 买卖股票的最佳时机(简单)

Blind 75 › 121. 买卖股票的最佳时机(简单) (第 1 章)
文章工具

题目

给你一个价格数组 prices,prices[i] 表示这支股票第 i 天的价格。你只能先在某一天买入,再在之后的某一天卖出,请算出这一笔交易最多能赚多少;如果怎么买都赚不到钱,就返回 0。

自造示例:prices = [4, 7, 1, 5] → 4。第 1 天买(4)、第 2 天卖(7)赚 3;第 3 天买(1)、第 4 天卖(5)赚 4,最大利润是 4。

再如:prices = [5, 4, 3, 2, 1] → 0。价格一路下跌,任何买入都只会亏,所以不交易。

约束:天数 1 ≤ n ≤ 105;单日价格 0 ≤ prices[i] ≤ 104。

思路

一句话:枚举每一天作为卖出日,它的最佳买入日就是「之前所有天里价格最低的那天」。

先想最直白的做法:枚举买入日 i,再枚举卖出日 j(j > i),记录所有 prices[j] - prices[i] 的最大值。这个思路完全正确,但时间是 O(n²);当 n = 105 时约要 1010 次比较,会超时。

关键观察:当卖出日固定时,前面的所有买入候选里,只需要知道价格最低的那一个;其他更贵的买入价都不可能产生更大的利润。所以二重循环可以拆成一次扫描:从左到右一边维护「历史最低价」lowest,一边用当前价格减它来更新答案。

这也是它被归到 Sliding Window 的原因:候选买入日是窗口左端,当前卖出日是窗口右端;窗口左端始终停在历史最低价,一旦遇到更低的价格,就把左端拉到当前位置。

以 [4, 7, 1, 5] 为例:

天price历史最低当天利润最大利润
14400
2

🔒

本篇为付费内容

您已阅读试读部分,购买后即可解锁全文。

⚠️ 本站内容已做唯一性标记并受版权保护,未经授权禁止转载,侵权必究。

还没有评论,来说两句?

发表评论

欢迎交流技术细节;广告与人身攻击会被删除。

在线咨询