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).
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
0 < prices[i], fee < 5 * 104
class Solution { public int maxProfit(int[] prices, int fee) { int cash = 0, hold = -prices[0]; for (int i = 1; i < prices.length; i++) { cash = Math.max(cash, hold + prices[i] - fee); hold = Math.max(hold, cash - prices[i]); } return cash; } }
Intuition and Algorithm
At the end of the i
-th day, we maintain cash
, the maximum profit we could have if we did not have a share of stock, and hold
, the maximum profit we could have if we owned a share of stock.
To transition from the i
-th day to the i+1
-th day, we either sell our stock cash = max(cash, hold + prices[i] - fee)
or buy a stock hold = max(hold, cash - prices[i])
. At the end, we want to return cash
. We can transform cash
first without using temporary variables because selling and buying on the same day can't be better than just continuing to hold the stock.
很有道理,分为第i天结束时手里有stock和没stock,第i+1天要么买要么卖,更新对应的max值即可。