一、题目描述:
今天我们来做一个简单的买股票的题,看看会不会对实际生活有些启发
二、这道题考察了什么思想?你的思路是什么?
题目比较明确,就是给定我们一个数组 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. 买卖股票的最佳时机
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~