【刷题日记】121. 买卖股票的最佳时机

1,311 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情

本次刷题日记的第 87 篇,力扣题为:121. 买卖股票的最佳时机

一、题目描述:

今天我们来做一个简单的买股票的题,看看会不会对实际生活有些启发

二、这道题考察了什么思想?你的思路是什么?

题目比较明确,就是给定我们一个数组 prices ,表示某只股票每天的价格,我们可以在任意一天买入或者卖出,但是不能在同一天既买入又买卖出,做题也得符合市场的基本情况嘛

本题 要求我们按照规则买入和卖出股票,我们能获得的最大利润是多少

分析

看了这个题,心想要是实际生活中,每一天的股票价格我都能明确知道的话,那么我的收入肯定就不仅仅只有劳动力了,直接运用这个题的原理,低买高卖不就得了吗

当然,实际的股市比这个复杂得多,但是咱们来分析这个题,如果是想获得最大的利润,可不就是得在时间顺势推移的情况,能够做到从最低点买入,然后从买入时间之后的最高点卖出,这就可以获得最大利润了

还有一点这里需要注意,如果我们买入的价格总是比卖出的价格高,那么按照题目要求,是返回 0 , 而不是返回亏损的钱

按照示例 1 ,我们可以来演示一波:

初始化的时候,我们暂且设定买入的股票价格最低为 MaxInt64,我们可以获得的最大利润为 0

原数组715364
minValueMaxInt64
maxValue0

开始遍历 prices 数组

遍历到 7minValue7
maxValue0
遍历到 1minValue1
maxValue0
遍历到 5minValue1
maxValue4
遍历到 3minValue1
maxValue4
遍历到 6minValue1
maxValue5
遍历到 4minValue1
maxValue5

则示例的最大利润是 5

就按照咱们这种方式,总是认为自己买入的股票就是最低点,然后不停的去计算最大值和更新股票最低点

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码

  • 按照如上思想,咱们翻译代码即可,此处需要注意,咱们初始化的时候 minValue 至少要大于 1e5 ,根据题意 prices[i] 的最大值是 1e5 ,这是为了减少咱们在极端情况出现错误

编码如下:

func maxProfit(prices []int) int {
    minValue := math.MaxInt64
    maxValue := 0
    for i := 0; i < len(prices); i++ {
        if prices[i] < minValue {
            minValue = prices[i]
        } else if prices[i]-minValue > maxValue {
            maxValue = prices[i] - minValue
        }
    }
    return maxValue
}

四、总结:

咱们这种解题方式,时间复杂度很明确是 O(n) ,我们只遍历了 1 次 prices 数组,另外空间复杂度是 O(1) ,我们未引入其他更多的空间消耗

原题地址:121. 买卖股票的最佳时机

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~