LeetCode 買賣股票的最佳時機

買賣股票的最佳時機


題目來源: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

實現結果


實現結果

參考


引用

https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/solution/121-mai-mai-gu-piao-de-zui-jia-shi-ji-dp-7-xing-ji/


以上就是使用數學方法,將求差轉換爲求區間和,解決《買賣股票的最佳時機》問題的主要內容。

歡迎關注微信公衆號《書所集錄》 歡迎關注微信公衆號《書所集錄》
相關文章
相關標籤/搜索