LeetCode #123: Best Time to Buy and Sell Stock III

Oscar

May 22, 2020 12:14 Technology

This is a LeetCode hard question, which is good for practicing the DP(2d) algorithm.

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 at most two transactions.

Note: You may not engage in multiple transactions at the same time (i.e., you must sell the stock before you buy again).

Example 1:

Input: [3,3,5,0,0,3,1,4]
Output: 6
Explanation: Buy on day 4 (price = 0) and sell on day 6 (price = 3), profit = 3-0 = 3.
             Then buy on day 7 (price = 1) and sell on day 8 (price = 4), profit = 4-1 = 3.

Example 2:

Input: [1,2,3,4,5]
Output: 4
Explanation: Buy on day 1 (price = 1) and sell on day 5 (price = 5), profit = 5-1 = 4.
             Note that you cannot buy on day 1, buy on day 2 and sell them later, as you are
             engaging multiple transactions at the same time. You must sell before buying again.

Example 3:

Input: [7,6,4,3,1]
Output: 0
Explanation: In this case, no transaction is done, i.e. max profit = 0.

 

Solution:

  • DP (2d) method: 1st dimension is transaction (k); 2nd dimension is time (i).
  • Recursive relation: S[k, i] = max( S[k, i-1], max(S[k-1, j-1] + P[i] - P[j]) ), where k=1~K, i=1~N, j<i. (The default time complexity is O(K*N^2))
  • We can reduce the time complexity to O(K*N), by introducing a temporal variable: S[k, i] = max( S[k, i-1], P[i]-d ), where d = max(S[k-1, j-1] - P[j]).
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        K = 2; ntime = len(prices)
        if ntime <= 1:
            return 0
        else:
            S = [[0 for i in range(ntime)] for k in range(K+1)]
            for k in range(1, K+1):
                mindiff = prices[0]
                for i in range(1, ntime):
                    mindiff = min(mindiff, prices[i]-S[k-1][i-1])
                    S[k][i] = max(S[k][i-1], prices[i]-mindiff)

            return S[-1][-1]

 

Share this blog to:

837 views,
0 likes, 0 comments

Login to comment