LeetCode-贪心-买卖股票的最佳时机
LeetCode-贪心-买卖股票的最佳时机
✏️ 关于专栏:专栏用于记录
prepare for the coding test
。
文章目录
- LeetCode-贪心-买卖股票的最佳时机
- 📝买卖股票的最佳时机
- 🎯题目描述
- 🔍 输入输出示例
- 🧩题目提示
- 🧪AC
- 🚀 拓展思考
- 🌟 总结
📝买卖股票的最佳时机
🎯题目描述
给定一个数组
prices
,它的第i
个元素prices[i]
表示一支给定股票第i
天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回
0
。
🔗题目链接:买卖股票的最佳时机
🔍 输入输出示例
示例 1:
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:
输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
🧩题目提示
1 <= prices.length <= 105
0 <= prices[i] <= 104
🧪AC
- 贪心算法:该题的核心在于实时维护最低买入价格
min_price
,同时在遍历中计算当前价格卖出可获得的利润p - min_price
,不断更新最大利润ans
。 - 为什么贪心有效?
- 买入时机只能往前找最低价格,卖出时机往后找最高价格,利润最大。
- 只要保证每次计算的卖出价格比之前记录的最低买入价格高,就可以更新最大利润。
- 不需要回溯或动态规划,时间复杂度是 O(n),空间复杂度 O(1)。
- 边界条件
- 当股票价格一直下降时,利润为0,即不进行交易。
本题的核心在于找到买入价格的最低点和随后卖出的最高点,确保买卖时序正确。
关键点分析:
- 必须保证卖出时间在买入时间之后。因此不能简单地用最大价格减最小价格。
- 用贪心算法解决: 在遍历过程中维护当前遇到的最低买入价格
min_price
,并在每一天计算当前卖出价格p
与min_price
的差值,更新最大利润。 - 算法的正确性基于贪心选择性质:
- 每天的最低价格都是潜在的买入点,及时更新;
- 利润最大时的卖出点是当前价格减去历史最低买入价。
class Solution {
public:int maxProfit(vector<int>& prices) {int ans = 0;int min_price = prices[0];for(int p : prices){ans = max(ans,p - min_price);min_price = min(min_price,p);}return ans;}
};
min_price:用于跟踪迄今为止遇到的最低股票价格,即最优买入点。
max_profit:用于记录遍历过程中的最大收益。
每次遍历:
- 遇到更低价时更新买入点;
- 否则尝试计算卖出利润,并更新最大利润。
最终返回最大利润。
🚀 拓展思考
- 多次交易场景
- 如果允许多次买卖,如何设计算法?
- 答:可以贪心累加每一次上涨区间的差值,参考“买卖股票的最佳时机 II”。
- 如果允许多次买卖,如何设计算法?
- 交易费用与冷冻期
- 若每次交易需要付手续费,或卖出后有冷冻期,问题将变得复杂。
- 此时可用动态规划方法,记录状态转移。
- 买卖股票含限价单
- 限价单等交易策略可引入不同的约束和优化问题。
- 具体买卖日期
- 本题只求最大利润,若需要具体买卖日期,只需在遍历时记录买入和卖出时的索引。
🌟 总结
- 该题是经典的贪心问题,核心思想是实时维护最低买入价,计算最大卖出利润。
- 代码简洁,效率高,适合入门贪心算法题。
- 理解该题,有助于掌握更复杂的股票买卖变种问题。
❤️ 如果对你有帮助,别忘了点赞、收藏支持一下,我将持续更新更多高质量刷题笔记!
📘 点击查看 👉 算法笔记专栏:Prepare for the Coding Test