Skip to content

题目链接 · 灵神原题解(署名来源)

低价买入,高价卖出。

从左到右枚举卖出价格 prices[i]。要想获得最大利润,哪天买入最好?在股票价格最低的那天买入。

注意,买入日期必须在卖出日期之前,所以我们求的是从 prices[0]prices[i1] 的最小值,这可以用一个变量 minPrice 维护。

由于只能买卖一次,所以在遍历中,计算 prices[i]minPrice 的最大值,就是答案。

:下面代码中,我们先更新 ans,再更新 minPrice,以保证 minPriceprices[i] 之前。请读者思考:更新顺序能否交换?如果一定要交易一次,即使亏钱也要交易,更新顺序能否交换?

python
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        ans = 0
        min_price = prices[0]
        for p in prices:
            ans = max(ans, p - min_price)
            min_price = min(min_price, p)
        return ans
cpp
// C++ 版待补充
cpp
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;
    }
};

复杂度分析

  • 时间复杂度:O(n),其中 nprices 的长度。
  • 空间复杂度:O(1)

思考题

  1. 如果一定要交易一次,代码应该如何修改?
  2. 返回一个长为 nanswer 数组,其中 answer[i] 等于删除 prices[i] 后(相当于禁止在第 i 天买卖股票)本题的答案。

欢迎在评论区发表你的思路/代码。

股票买卖系列题目

分类题单

如何科学刷题?

  1. 滑动窗口与双指针(定长/不定长/单序列/双序列/三指针/分组循环)
  2. 二分算法(二分答案/最小化最大值/最大化最小值/第K小)
  3. 单调栈(基础/矩形面积/贡献法/最小字典序)
  4. 网格图(DFS/BFS/综合应用)
  5. 位运算(基础/性质/拆位/试填/恒等式/思维)
  6. 图论算法(DFS/BFS/拓扑排序/基环树/最短路/最小生成树/网络流)
  7. 动态规划(入门/背包/划分/状态机/区间/状压/数位/数据结构优化/树形/博弈/概率期望)
  8. 常用数据结构(前缀和/差分/栈/队列/堆/字典树/并查集/树状数组/线段树)
  9. 数学算法(数论/组合/概率期望/博弈/计算几何/随机算法)
  10. 贪心与思维(基本贪心策略/反悔/区间/字典序/数学/思维/脑筋急转弯/构造)
  11. 链表、二叉树与回溯(前后指针/快慢指针/DFS/BFS/直径/LCA/一般树)
  12. 字符串(KMP/Z函数/Manacher/字符串哈希/AC自动机/后缀数组/子序列自动机)

我的题解精选(已分类)

欢迎关注 B站@灵茶山艾府

本文整理自灵茶山艾府(endlesscheng)的公开内容,仅供个人学习使用

本站仅供个人学习使用,请勿外传