剑指offer刷题笔记- 63. 股票的最大利润

在这里插入图片描述
第一思路是遍历数组,记录之前产生的最大利润和最低价格。因为题目规定先买再卖,每个iter卖出的可能最大利润都是当前价格减去历史最低价。再比较当前iter的利润与历史最大利润的大小,来更新历史最大利润。若当前价格小于历史最低价,则更新历史最低价。
代码如下

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        if len(prices) == 0:
            return 0
        max_pft = 0
        min_price = prices[0]
        for i in prices:
            if i <= min_price:
                min_price = i
            else:
                pft = i - min_price
                if pft > max_pft:
                    max_pft = pft
        return max_pft

速度和memory都是60%多,不过看了解体思路发现此解实际上是用的动态规划思想,于是补了一下动态规划的知识:
此文讲的非常清楚,先上 链接.
看完此文,发现其实此题过分简单,并不是一个典型动态规划题。 动态规划适用的题目符合两个特点:1. 最优解可以由其子问题的最优解组合而成。此题符合这个特点,price[:i]的最大利润,可由price[:i-1]的最大利润与price[i] - min_price的最大值求得,price[:i-1]的最大利润,就是一个子问题的最优解。
2. 求最优解的过程中,会重复计算最优子问题的解。动态规划可以通过记录下求过的子问题的解,来避免重复计算。此问题并不符合这个特点。
所以可见动态规划面向的还是更复杂一些的问题。

おすすめ

転載: blog.csdn.net/baidu_37360677/article/details/108563835