Best Time to Buy and Sell Stock with Transaction Fee
Description
Your are given an array of integers prices
, for which the i
-th element is the price of a given stock on day i
; and a non-negative integer fee
representing a transaction fee.
You may complete as many transactions as you like, but you need to pay the transaction fee for each transaction. You may not buy more than 1 share of a stock at a time (ie. you must sell the stock share before you buy again.)
Return the maximum profit you can make.
Example 1:
Input: prices = [1, 3, 2, 8, 4, 9], fee = 2 Output: 8 Explanation: The maximum profit can be achieved by:
Note:
0 < prices.length <= 50000
.0 < prices[i] < 50000
.0 <= fee < 50000
.Solution(javascript)
/*
* @lc app=leetcode id=714 lang=javascript
*
* [714] Best Time to Buy and Sell Stock with Transaction Fee
*/
// @lc code=start
// /** 同时需要保证交易的次数尽可能的小
// * Top-down: Maximum call stack size exceeded
// * @param {number[]} prices
// * @param {number} fee
// * @return {number}
// */
// const maxProfit = function (prices, fee) {
// const BUY = 0
// const SELL = 1
// const memo = []
// const aux = (index, prev) => {
// memo[index] = memo[index] || []
// if (memo[index][prev] !== undefined) {
// return memo[index][prev]
// }
// if (index >= prices.length) {
// return 0
// }
// if (prev === SELL) {
// memo[index][prev] = Math.max(
// -prices[index] + aux(index + 1, BUY),
// aux(index + 1, SELL),
// )
// } else {
// memo[index][prev] = Math.max(
// prices[index] - fee + aux(index + 1, SELL),
// aux(index + 1, BUY),
// )
// }
// return memo[index][prev]
// }
// return aux(0, SELL)
// }
/**
* Bottom-up
* @param {number[]} prices
* @param {number} fee
* @return {number}
*/
const maxProfit = function (prices, fee) {
const BUY = 0
const SELL = 1
let memo = [0, 0]
for (let index = prices.length - 1; index >= 0; index--) {
const current = []
current[SELL] = Math.max(
-prices[index] + memo[BUY],
memo[SELL],
)
current[BUY] = Math.max(
prices[index] - fee + memo[SELL],
memo[BUY],
)
memo = current
}
return memo[SELL]
}
// @lc code=end