力扣第121题-买卖股票的最佳时机

题目描述

给定一个数组 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。

提示:

1 <= prices.length <= 105
0 <= prices[i] <= 104

解题思路

思路一:暴力双层遍历

这个方法简单粗暴易于理解,外层遍历除了列表最后一个元素的所有元素,内层遍历当前外层遍历元素的下一个元素直到列表结尾,然后计算差值,用一个最大利润的变量存储差值,找到利润的最大值即可。 — 当然,这种解法超出时间限制了!

代码实现:

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        # 方法一:暴力解法 -- 显然时间复杂度过高
        import math
        max_income = -math.inf
        for i in range(len(prices) - 1):
            for j in range(i + 1, len(prices)):
                if prices[j] - prices[i] > max_income:
                    max_income = prices[j] - prices[i]
        if max_income < 0:
            return 0
        return max_income

思路二:一层遍历

最开始我是没有想到有什么更优的解法的(感觉自己好菜呀555),然后看了力扣官方的题解,感觉思路很是奇特。

这个方法只要一层遍历,每一次循环的时候,都要计算出最大利润和最小的价格,而当前的一轮循环的最大利润是(当前的价格减去最小价格所得的差 和 最大利润这个变量的值 这两个值的最大值) 【注意初始化最大利润变量的时候最大利润这个变量的初始值一定要足够小,这道题中0足够了】,同时最小的价格是 【当前价格】 和 【最小价格】这两个变量的最小值,这样就能在一层循环里面将最小价格和最大利润同时求出来!下面看代码:

【!!!注意:下面代码来自力扣官方题解】:

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        # 方法二
        inf = int(1e9)
        minprice = inf
        maxprofit = 0
        for price in prices:
            maxprofit = max(price - minprice, maxprofit)
            minprice = min(price, minprice)
        return maxprofit
"""
作者:力扣官方题解
链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/solutions/136684/121-mai-mai-gu-piao-de-zui-jia-shi-ji-by-leetcode-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
"""

总结

今天做的这道题,看力扣官方题解给出的答案,感觉很惊喜,同时也感慨自己好笨呜呜呜。看来还是要继续好好刷题呀。