力扣第121题-买卖股票的最佳时机

183 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

前言

力扣第121题 买卖股票的最佳时机 如下所示:

给定一个数组 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。

一、思路

这一题的目的是计算买卖股票获得的最大利润,但是我们要注意以下的一些规则:

  • 买股票日期必须在卖股票日期之前
  • 如果没有合适的买卖日期,则利润为 0。(例如示例中 prices = [7,6,4,3,1],怎么买卖都是亏的,故不能出手)
  • 只能在某一天买一次股票,也只能在之后的某一天卖一次股票

上面的规则中最值得注意的就是,从买入到卖出整个过程只能发生一次。我们可以把股票每日的价格看做 折线图x 轴为日期),此处以示例1中的 [7,1,5,3,6,4] 作为例子。

image.png

对于某一天能产生的最大利润来说,是用当前的值减去前面价格中的最小值。假设卖出日期为第 4 天,则第四天卖出的最大的利润为 3 - 1= 2

综上所述:i 天卖出的最大利润为当前的价格减去历史最低价格(当前日之前)

经过上面的分析,实现的步骤大致分为以下两步:

  1. 初始化一维数组 minArr 用于存储历史最低价格
  2. 遍历求出从 1 ~ i 天卖出的最大利润,在其中取最大值即可

二、实现

实现代码

实现代码与思路中保持一致

    public int maxProfit(int[] prices) {
        int len = prices.length;
        int[] minArr = new int[len];
        minArr[0] = prices[0];  // 第一个元素前没有元素
        for (int i=1; i<len; i++){
            minArr[i] = Math.min(minArr[i-1], prices[i]);
        }
        int ret = 0;    // 收益
        for (int i=0; i<prices.length; i++){
            ret = Math.max(ret, prices[i] - minArr[i]);
        }
        return ret;
    }

测试代码

    public static void main(String[] args) {
        int[] prices = {7,1,5,3,6,4};
        new Number121().maxProfit(prices);
    }

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~