力扣——买卖股票的最佳时机

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

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

注意你不能在买入股票前卖出股票。(这次是只能操作一次,股票ll可以多次操作

一般解法:

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        profit = 0
        for index in range(len(prices)-1):
            sub = max(prices[index+1:]) - prices[index]
            if sub > profit:
                profit = sub
        return profit

动态规划:

class Solution(object):
    def maxProfit(self, prices):
        if not prices:
            return 0
        profit = 0
        dp = [0]
        minelement = prices[0]
        for i in range(1, len(prices)):
            minelement = min(minelement, prices[i])
            dp.append(max(dp[i - 1], prices[i] - minelement))
            if dp[-1] > profit:
                profit = dp[-1]
        return profit

动态规划 最重要的是掌握他的思想,动态规划的核心思想是把原问题分解成子问题进行求解,也就是分治的思想。

什么问题适合用动态规划呢?我们通过一个现实中的例子,来理解这个问题。大家可能在公司里面都有一定的组织架构,可能有高级经理、经理、总监、组长然后才是小开发,今天我们通过这个例子,来讲讲什么问题适合使用动态规划。又到了一年一度的考核季,公司要挑选出三个最优秀的员工。一般高级经理会跟手下的经理说,你去把你们那边最优秀的3个人报给我,经理又跟总监说你把你们那边最优秀的人报给我,经理又跟组长说,你把你们组最优秀的三个人报给我,这个其实就动态规划的思想!

动态规划问题,大致可以通过以下四部进行解决。

1.划分状态,即划分子问题,例如上面的例子,我们可以认为每个组下面、每个部门、每个中心下面最优秀的3个人,都是全公司最优秀的3个人的子问题

2.状态表示,即如何让计算机理解子问题。上述例子,我们可以实用 f[i][3]表示第i个人,他手下最优秀的3个人是谁。

3.状态转移,即父问题是如何由子问题推导出来的。上述例子,每个人 大Leader下面最优秀的人等于他下面的小Leader中最优秀的人中最优秀的几个。

4.确定边界,确定初始状态是什么,最小的子问题,最终状态又是什么。例如上述问题,最小的子问题就是每个小组长下面最优秀的人,最终状态是整个企业,初始状态为每个领导下面都没有最优名单,但是小组长下面拥有每个人的评分。

猜你喜欢

转载自blog.csdn.net/weixin_44659309/article/details/106151616