1. 程式人生 > >leetcode 121. 買賣股票的最佳時機 【動態規劃】【陣列】【Easy】

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、從上往下分析問題,從下往上求解問題。(子問題在分解大問題的過程中重複出現,為了避免重複求解子問題,可以用從下往上的順序先計算小問題的最優解並存儲下來,再以此為基礎求取最大問題的最優解)。