LeetCode 算法题库【121】——买卖股票的最佳时机Ⅰ

买卖股票的最佳时机

题目描述:

121

解题思路:
  • 第一种:这个方法有点类似于求最大子序和的贪心算法。先保证这个prices数组不是空列表,然后先假设最小值miniprices[0],然后一次比较列表中元素,发现更小的元素则重新赋值给mini,然后每次都通过prices[i] - mini获得一次最大利润maxi,最后返回最终得到的最大利润maxi
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        lens = len(prices)
        if lens == 0:
            return 0
        else:
            mini = prices[0]
            maxi = 0
            for i in range(lens):
                mini = min(mini, prices[i])
                maxi = max(maxi, prices[i] - mini)
            return maxi

1

  • 第二种:这个方法就比较巧妙了,我们可以发现如果把这个prices列表的相邻两个元素的差我们算出来然后放在另一个列表里,很容易推得,要求最大利润,也就是列表里的这两个元素之间的差,也就是这两个元素之间的所有相邻元素的差的和。所以这道题就简化变成了求这些差的最大子序和。我们先定义一个列表,然后用append()来把所有差放进去。后面就用之前用过求解最大子序和的方法,来求解就可以了。
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        lens = len(prices)
        cha = []
        for i in range(len(prices)-1):
            cha.append(prices[i+1]-prices[i])
        if len(cha) == 0:
            return 0
        else:
            temp = maxi = cha[0]
            for i in range(1, len(cha)):
                temp = max(cha[i], cha[i]+temp)
                maxi = max(maxi, temp)
            if maxi < 0:
                return 0
            else:
                return maxi

2

  • 第三种:这个方法是在第二个方法的基础上的改进,我们可以不需要重新定义一个列表就可以完成任务。通过max函数把小于0的差排除,又通过prices[i+1] - prices[i] + temp可以进行最大子序和的计算,每次得到的最大值赋给maxi,最后返回maxi。这个方法空间复杂度比上一个方法要小。
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        lens = len(prices)
        temp = maxi = 0
        for i in range(lens-1):
            temp = max(0, prices[i+1] - prices[i] + temp)
            maxi = max(temp, maxi)
        return maxi

3

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值