LeetCode 0714. Best Time to Buy and Sell Stock with Transaction Fee Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
0714. Best Time to Buy and Sell Stock with Transaction Fee

Description

You are given an array prices where prices[i] is the price of a given stock on the ith day, and an integer fee representing a transaction fee.

Find the maximum profit you can achieve. You may complete as many transactions as you like, but you need to pay the transaction fee for each transaction.

Note:

  • You may not engage in multiple transactions simultaneously (i.e., you must sell the stock before you buy again).
  • The transaction fee is only charged once for each stock purchase and sale.

 

Example 1:

Input: prices = [1,3,2,8,4,9], fee = 2
Output: 8
Explanation: The maximum profit can be achieved by:
- Buying at prices[0] = 1
- Selling at prices[3] = 8
- Buying at prices[4] = 4
- Selling at prices[5] = 9
The total profit is ((8 - 1) - 2) + ((9 - 4) - 2) = 8.

Example 2:

Input: prices = [1,3,7,5,10,3], fee = 3
Output: 6

 

Constraints:

  • 1 <= prices.length <= 5 * 104
  • 1 <= prices[i] < 5 * 104
  • 0 <= fee < 5 * 104

Solutions

Solution 1: Memoization

We design a function dfs(i, j), which represents the maximum profit that can be obtained starting from day i with state j. Here, j can take the values 0 and 1, representing not holding and holding a stock, respectively. The answer is dfs(0, 0).

The execution logic of the function dfs(i, j) is as follows:

If i ≥ n, there are no more stocks to trade, so we return 0.

Otherwise, we can choose not to trade, in which case dfs(i, j) = dfs(i + 1, j). We can also choose to trade stocks. If j \gt 0, it means that we currently hold a stock and can sell it. In this case, dfs(i, j) = prices[i] + dfs(i + 1, 0) - fee. If j = 0, it means that we currently do not hold a stock and can buy one. In this case, dfs(i, j) = -prices[i] + dfs(i + 1, 1). We take the maximum value as the return value of the function dfs(i, j).

The answer is dfs(0, 0).

To avoid redundant calculations, we use memoization to record the return value of dfs(i, j) in an array f. If f[i][j] is not equal to -1, it means that we have already calculated it, so we can directly return f[i][j].

The time complexity is O(n), and the space complexity is O(n). Here, n is the length of the array prices.

PythonJavaC++GoTypeScript
class Solution: def maxProfit(self, prices: List[int], fee: int) -> int: @cache def dfs(i: int, j: int) -> int: if i >= len(prices): return 0 ans = dfs(i + 1, j) if j: ans = max(ans, prices[i] + dfs(i + 1, 0) - fee) else: ans = max(ans, -prices[i] + dfs(i + 1, 1)) return ans return dfs(0, 0)(code-box)

Solution 2: Dynamic Programming

We define f[i][j] as the maximum profit that can be obtained up to day i with state j. Here, j can take the values 0 and 1, representing not holding and holding a stock, respectively. We initialize f[0][0] = 0 and f[0][1] = -prices[0].

When i ≥ 1, if we do not hold a stock at the current day, then f[i][0] can be obtained by transitioning from f[i - 1][0] and f[i - 1][1] + prices[i] - fee, i.e., f[i][0] = max(f[i - 1][0], f[i - 1][1] + prices[i] - fee). If we hold a stock at the current day, then f[i][1] can be obtained by transitioning from f[i - 1][1] and f[i - 1][0] - prices[i], i.e., f[i][1] = max(f[i - 1][1], f[i - 1][0] - prices[i]). The final answer is f[n - 1][0].

The time complexity is O(n), and the space complexity is O(n). Here, n is the length of the array prices.

We notice that the transition of the state f[i][] only depends on f[i - 1][] and f[i - 2][]. Therefore, we can use two variables f_0 and f_1 to replace the array f, reducing the space complexity to O(1).

PythonJavaC++GoTypeScript
class Solution: def maxProfit(self, prices: List[int], fee: int) -> int: n = len(prices) f = [[0] * 2 for _ in range(n)] f[0][1] = -prices[0] for i in range(1, n): f[i][0] = max(f[i - 1][0], f[i - 1][1] + prices[i] - fee) f[i][1] = max(f[i - 1][1], f[i - 1][0] - prices[i]) return f[n - 1][0](code-box)

Solution 3

PythonJavaC++GoTypeScript
class Solution: def maxProfit(self, prices: List[int], fee: int) -> int: f0, f1 = 0, -prices[0] for x in prices[1:]: f0, f1 = max(f0, f1 + x - fee), max(f1, f0 - x) return f0(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !