题目:
给定一个数组,它的第 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、从上往下分析问题,从下往上求解问题。(子问题在分解大问题的过程中重复出现,为了避免重复求解子问题,可以用从下往上的顺序先计算小问题的最优解并存储下来,再以此为基础求取最大问题的最优解)。