LeetCode121-买卖股票的最佳时机

上个星期一直都在弄互联网+的比赛

周六打完比赛

周日打“锐捷杯”编程比赛

周日的比赛就不提了

一是没有准备

而是自己技术太菜

被虐得体无完肤

周六比赛的结果今天刚出来

所幸,顺利通过了第一轮

后面,继续加油啦!

心情好,附上几张图片啊!

121-买卖股票的最佳时机

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

注意你不能在买入股票前卖出股票。

示例 1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

示例 2:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

思路:

这一题刚开始想的是递归求解,无非就是固定首尾指针,不是首指针往右边移,就是尾指针往左边移。所以写两个递归式即可得出答案。

代码如下:

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        # 定义获取的最大利润
        max_profit = 0
        if len(prices) <= 1:
            return max_profit

        def back(start, end, max_profit):
            if start >= end:
                return max_profit
            profit = prices[end] - prices[start]
            max_profit = back(start+1, end, max(max_profit, profit))
            max_profit = back(start, end-1, max(max_profit, profit))
            return max_profit
        return back(0, len(prices)-1, 0)


if __name__ == "__main__":
    prices = [2, 1, 4]
    max_profit = Solution().maxProfit(prices)
    print(max_profit)

但可气的是TLE了,既然递归行不通,那就只能是老老实实的通过遍历数组来找出答案了。

这一题其实也和前面的接雨水题目很类似,就是要找到符合题意的“相对”最大值和最小值,只不过本题中还有一个限制就是:最小值一定要在最大值的左边。因为考虑到收益问题,所以这题就不能是一开始就固定首尾指针了,而是先从左至右找到一最小值,该值符合以下条件:比左边的值都小,比右边相邻的值也小。最小值找到了再往右遍历找相应的最大值,依次循环。

代码如下:

class Solution(object):
    # 本题采用双指针法,从左至右依次遍历
    # 本题其实和接雨水题目很类似
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        # 定义获取的最大利润
        max_profit = 0
        if len(prices) <= 1:
            return max_profit

        # 分别定义股票的最小价格以及最高价格
        min_price = prices[0]
        max_price = 0
        for index in range(len(prices)):
            if prices[index] <= min_price:
                min_price = prices[index]
            elif prices[index] - min_price > max_price:
                max_price = prices[index] - min_price
        return max_price

if __name__ == "__main__":
    prices = [2, 1, 4]
    max_profit = Solution().maxProfit(prices)
    print(max_profit)

执行效率还算不错,达到了99%

 


2019/6/5 9:10 更新

昨天写完文章后,一些读者就给我分享了新的解法,让我很是收益,下面就一一分享出来。

 这位读者是把我上面的解法给精简了,步骤更简单了。典型的贪心算法。

代码如下:

class Solution(object):
    # 本题采用双指针法,从左至右依次遍历
    # 本题其实和接雨水题目很类似
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        # 定义获取的最大利润
        max_profit = 0
        if len(prices) <= 1:
            return max_profit

        # 分别定义股票的最小价格以及最高价格
        min_price = prices[0]
        max_price = 0
        for price in prices:
            max_price = max(max_price, price-min_price)
            min_price = min(min_price, price)
        return max_price

if __name__ == "__main__":
    prices = [2, 1, 4]
    max_profit = Solution().maxProfit(prices)
    print(max_profit)

不过,执行效率倒是不升反降了,在80%左右。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习的学习者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值