題目來源:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stockpython
給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。算法
若是你最多隻容許完成一筆交易(即買入和賣出一支股票),設計一個算法來計算你所能獲取的最大利潤。數組
注意你不能在買入股票前賣出股票。bash
示例 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。
將求差問題轉換爲區間和的問題。ui
這裏採用牛頓萊布尼茲公式來側面說明下轉換的問題:spa
可是在這裏 F() 並非連續的,而是離散的,a 和 b 表明的是數組的下標。設計
在這裏 F() 表示的數組稱爲前綴和。code
前綴和:一個數組的某項下標以前(包括此項元素)的全部數組元素的和
這樣,求差問題就能夠轉換爲區間和的問題。
最大連續子數組和的問題,能夠使用動態規劃來求解。
dp[i]
表示以 i 結尾的最大連續子數組和,結合題意,狀態轉移方程爲:dp[i]=max(0, dp[i-1]+diff[i])
這裏 dp[i]
數組可被優化,因此上面的式子可變爲:
last = max(0, last + diff[i])
其中 diff[i] = prices[i + 1] - prices[i]
,表示相隔兩天股票價格的差值。因此上面的式子可進一步優化爲:
last = max(0, last + prices[i + 1] - prices[i])
class Solution: def maxProfit(self, prices: List[int]) -> int: last, profit = 0, 0 for i in range(len(prices) - 1): last = max(0, last + prices[i+1] -prices[i]) profit = max(profit, last) return profit
以上就是使用數學方法,將求差轉換爲求區間和,解決《買賣股票的最佳時機》問題的主要內容。
歡迎關注微信公衆號《書所集錄》 歡迎關注微信公衆號《書所集錄》