LeetCode 309. Best Time to Buy and Sell Stock with Cooldown

何睿發表於2019-02-16

Description

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times) with the following restrictions:

  • You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
  • After you sell your stock, you cannot buy stock on next day. (ie, cooldown 1 day).

Example:

Input: [1,2,3,0,2]
Output: 3 
Explanation: transactions = [buy, sell, cooldown, buy, sell]

描述

給定一個整數陣列,其中第 i 個元素代表了第 i 天的股票價格 。​

設計一個演算法計算出最大利潤。在滿足以下約束條件下,你可以儘可能地完成更多的交易(多次買賣一支股票):

  • 你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。
  • 賣出股票後,你無法在第二天買入股票 (即冷凍期為 1 天)。

示例:

輸入: [1,2,3,0,2]
輸出: 3 
解釋: 對應的交易狀態為: [買入, 賣出, 冷凍期, 買入, 賣出]

思路

  • 這道題使用動態規劃。
  • 狀態:colldown 表示當天休息能夠獲得的最大價值,hold 表示當天持有股票能夠獲得的最大價值,sold 表示當天持有股票能夠獲得的最大價值。
  • 初始狀態:colldown = 0, hold = -∞, sold = 0。
  • 狀態轉移方程:colldown :如果當前休息,那麼當前的價值可以來自於前一天休息或者前一天賣出股票(前一天買進股票不會產生收益),所以 colldown = max(colldown, sold);hold :如果當天選擇繼續持有股票,則當天可以選擇繼續持有昨天的股票,或者昨天休息今天買進股票,所以hold = max(oldhold, colldown – prices[i]); sold :當天賣出股票,則其價值只能來自於昨天買進今天賣出 sold = oldhold + prices[i]。
# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-02-13 14:21:33
# @Last Modified by:   何睿
# @Last Modified time: 2019-02-13 17:36:21

import sys


class Solution:
    def maxProfit(self, prices: `List[int]`) -> `int`:
        # 少於兩天無法進行交易
        if len(prices) < 2: return 0
        colldown, hold, sold = 0, -sys.maxsize, 0
        for day in range(len(prices)):
            oldhold = hold
            # 當天持有:當天可以什麼都不做,持有昨天持有的股票
            # 或者當天買進股票
            # 所以:當天價值可以來自前一天持有的價值,或者前一天休息今天買入的價值
            hold = max(oldhold, colldown - prices[day])
            # 當天休息:當天的價值可以來自於前一天休息的價值
            # 或者前一天賣出的價值
            colldown = max(colldown, sold)
            # 當天賣出:當前價值來自前一天持有加上今天的價值
            sold = oldhold + prices[day]
        return max(colldown, sold)

原始碼檔案在這裡.
©本文首發於何睿的部落格,歡迎轉載,轉載需保留文章來源,作者資訊和本宣告.

相關文章