leetcode 121. 买卖股票的最佳时机 【动态规划】【数组】【Easy】

题目:

给定一个数组,它的第 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。

思路:

        题目就是相当于找出后面数值减前面数值的最大差值。第一种方法就是两层for循环遍历逐个减,时间复杂度是O(n²)。效率太低。第二种方法运用到了动态规划的思想。要求出最大利润,首先进行遍历数组时,需要保存当前股票价格的最小值和当前利润的最大值,依次更新这两个值。遍历结束后,返回当前最大利润值即可。

       如:当前利润最大值是maxpro,当前最小股票价格是minPrice。

        当前股票价格是prices[i],需要判断的是:

        第一, min = min > prices[i] ? prices[i] : min

        第二,maxpro = maxpro < prices[i] - min ? prices[i] - min : maxpro

代码:

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        if prices == None or len(prices) < 0:
            return None
        if len(prices) == 0:
            return 0
        maxpro,minPrice = 0,prices[0]
        for item in prices:
            if item < minPrice:
                minPrice = item
            if maxpro < item - minPrice:
                maxpro = item - minPrice
        return maxpro

注:什么时候可以判断出一道题目是否可以用“动态规划”的方法来求解呢?

    如果,是鳅一个问题的最优解(通常是最大值或者最小值),而且问题能够分解成若干子问题,并且子问题之间还有重叠的更小的子问题,就可以考虑用动态规划的方法解决这个问题。

    用动态规划求解问题的几个特点:

1、求一个问题的最优解。

2、整体问题的最优解是依赖各个子问题的最优解。

3、把大问题分解成若干个小问题,这些小问题之间还有相互重叠的更小的子问题。

4、从上往下分析问题,从下往上求解问题。(子问题在分解大问题的过程中重复出现,为了避免重复求解子问题,可以用从下往上的顺序先计算小问题的最优解并存储下来,再以此为基础求取最大问题的最优解)。

 

你可能感兴趣的:(Leetcode)