携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情
本次刷题日记的第 87 篇,力扣题为:121. 买卖股票的最佳时机
一、题目描述:
今天我们来做一个简单的买股票的题,看看会不会对实际生活有些启发
二、这道题考察了什么思想?你的思路是什么?
题目比较明确,就是给定我们一个数组 prices ,表示某只股票每天的价格,我们可以在任意一天买入或者卖出,但是不能在同一天既买入又买卖出,做题也得符合市场的基本情况嘛
本题 要求我们按照规则买入和卖出股票,我们能获得的最大利润是多少
分析
看了这个题,心想要是实际生活中,每一天的股票价格我都能明确知道的话,那么我的收入肯定就不仅仅只有劳动力了,直接运用这个题的原理,低买高卖不就得了吗
当然,实际的股市比这个复杂得多,但是咱们来分析这个题,如果是想获得最大的利润,可不就是得在时间顺势推移的情况,能够做到从最低点买入,然后从买入时间之后的最高点卖出,这就可以获得最大利润了
还有一点这里需要注意,如果我们买入的价格总是比卖出的价格高,那么按照题目要求,是返回 0 , 而不是返回亏损的钱
按照示例 1 ,我们可以来演示一波:
初始化的时候,我们暂且设定买入的股票价格最低为 MaxInt64,我们可以获得的最大利润为 0
原数组 | 7 | 1 | 5 | 3 | 6 | 4 |
---|
minValue | MaxInt64 |
---|---|
maxValue | 0 |
开始遍历 prices 数组
遍历到 7 | minValue | 7 |
---|---|---|
maxValue | 0 |
遍历到 1 | minValue | 1 |
---|---|---|
maxValue | 0 |
遍历到 5 | minValue | 1 |
---|---|---|
maxValue | 4 |
遍历到 3 | minValue | 1 |
---|---|---|
maxValue | 4 |
遍历到 6 | minValue | 1 |
---|---|---|
maxValue | 5 |
遍历到 4 | minValue | 1 |
---|---|---|
maxValue | 5 |
则示例的最大利润是 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. 买卖股票的最佳时机
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~