太久没更了,抽空学习下。
看一道简单题。
python
class Solution:
def maxProfit(self, prices: List[int]) -> int:
cost = -1
profit = 0
for i in prices:
if cost == -1:
cost = i
continue
profit_ = i - cost
if profit_ > profit:
profit = profit_
if cost > i:
cost = i
return profit
📌 解题思路:贪心算法
🔹 什么是贪心算法?
贪心算法(Greedy Algorithm 的核心思想是:
在每一步都做出当前最优的选择(局部最优),最终得到全局最优解。
在这道题中,我们的目标是在最低点买入,并在未来的某一天卖出,以获得最大利润。
局部最优解:在遍历数组 prices 时,始终记录当前的最低买入价格 cost,并尝试计算最大利润 profit。
全局最优解:整个遍历过程中,确保 profit 始终是所有可能利润中的最大值。
🔹 变量说明
cost:存储最低买入价格,初始为 prices[0](第一天的价格)。
profit:存储最大利润,初始为 0(默认没有利润)。
🔹 遍历 prices 数组的过程
更新最低买入价格 cost
cost = min(cost, i)
遍历过程中,如果发现更低的股票价格 i,就更新 cost,保证买入价始终是历史最低价。
计算并更新最大利润 profit
profit = max(profit, i - cost)
计算当前价格 i 和 cost 之间的利润。
如果利润 i - cost 比之前记录的 profit 更大,就更新 profit。
📌 复杂度分析
时间复杂度:O(n),其中 n 是 prices 的长度。
只遍历一次数组,每次操作 O(1)。
空间复杂度:O(1)。
只使用了 cost 和 profit 两个变量,没有额外的数据结构。
📌 结论:贪心算法的适用性
为什么这道题可以用贪心算法?
题目保证只能买卖一次,所以我们只需关注最低买入价格和最大利润,不需要回溯。
每一步都在做局部最优决策(维护最小买入价,计算最大利润),最终得到了全局最优解。
由于股票价格不能回退,过去的最优选择不会影响未来的决策,所以贪心算法是合适的。
⚠️ 什么时候不能用贪心?
如果题目允许多次买卖(比如 122. 买卖股票的最佳时机 II),贪心算法可能不是最佳选择,因为需要考虑交易次数和冷却期等限制,此时可能需要动态规划(DP)。
📌 总结
✅ 这道题可以使用贪心算法,因为每一步的局部最优(最低买入价 & 最大利润)最终导向了全局最优解。
✅ 时间复杂度 O(n),空间复杂度 O(1),是非常高效的解法。
✅ 代码逻辑清晰,适用于类似的一次交易股票买卖问题。