【LeetCode】5. 贪心算法:买卖股票时机

太久没更了,抽空学习下。

看一道简单题。

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:存储最低买入价格,初始为 prices0(第一天的价格)。

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),是非常高效的解法。

✅ 代码逻辑清晰,适用于类似的一次交易股票买卖问题。

相关推荐
智者知已应修善业35 分钟前
【51单片机8位数码管同时倒计时从9999】2024-1-25
c++·经验分享·笔记·算法·51单片机
洛水水38 分钟前
【力扣100题】86.柱状图中最大的矩形
算法·leetcode·职场和发展
渡之1 小时前
GRiM-Net 深度解析 | 无人机 GNSS 拒止场景下两阶段跨视角视觉定位框架
深度学习·算法·动态规划·无人机
测试仪器廖生135902563851 小时前
罗德与施瓦茨 FSP13频谱分析仪FSP30
网络·人工智能·算法
happymaker06261 小时前
LeetCodeHot100——560.和为K的子数组
算法
dtq04241 小时前
C语言刷题数组5,6(求平均值,求最大值)
c语言·数据结构·算法
郭梧悠2 小时前
Hash算法入门Hash冲突解决方案
算法·哈希算法
洛水水2 小时前
【力扣100题】81.寻找两个正序数组的中位数
数据结构·算法·leetcode
happymaker06263 小时前
LeetCodeHot100——155.最小栈
算法
洛水水3 小时前
【力扣100题】85.每日温度
算法·leetcode·职场和发展