刷题2021-11-23 买卖股票的较佳时机

这篇博客探讨了如何找到购买和出售股票的最佳时机以获得最大利润。作者分享了自己的解决方案,初始版本使用了两个变量记录最大值和最小值,然后优化后的版本通过减少变量使用提升了执行效率,最终实现了96ms的执行时间和22.7MB的内存消耗。
摘要由CSDN通过智能技术生成

买进股票的最佳时机

(用最佳时机CSDN说是标题党,哈哈哈)
给定一个数组 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。

我的答案:

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
    	#定义一个max和min分别来接收最大值和最小值
        max = min =  prices[0]
        #定义money为最大收益
        money = max -min 
        for i in range(len(prices)):
        	#如果说当前值大于最大值,那么最大值等于当前
            if prices[i] > max:
                max = prices[i]
            #如果当前值小于最小值,则之前的最大值也作废,让最大值和最小值都指向这个值
            if prices[i] < min:
                min = prices[i]
                max = prices[i]
             #如果最大值和最小值之差大于最大收益,则记住这个最大收益
            if (max - min ) > money:
                money = max - min
        return money

执行结果:通过
执行用时:124 ms, 在所有 Python3 提交中击败了93.36%的用户
内存消耗:23.6 MB, 在所有 Python3 提交中击败了16.32%的用户
通过测试用例:211 / 211
(空间复杂度比较大,但是感觉这已经是我用的最少的变量了)

大佬答案:
(大佬的比较均衡)
float(‘inf’)表示正无穷

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
    	#max = 0;min为正无穷
        max_,min_ = 0,float('inf')
        for i in prices:
            max_ = max(max_,i-min_)
            min_ = min(min_,i)
        return max_  

看到了大佬的解法以后我改进了一下我的答案:
(每次循环总喜欢用list[]的方式去遍历,这是个坏习惯!)

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        max = min =  prices[0]
        money = max -min 
        for i in prices:
            if i > max:
                max = i
            if i < min:
                max = min = i
            if (max - min ) > money:
                money = max - min
        return money

于是
执行用时:96 ms, 在所有 Python3 提交中击败了98.53%的用户
内存消耗:22.7 MB, 在所有 Python3 提交中击败了94.72%的用户

内存一下上来不少,这个是差不多最好的效果了(leetcode的执行效率很看脸)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值