714. 买卖股票的最佳时机含手续费
- 原题链接:
- 完成情况:
- 解题思路:
- Explanation
- Summary
- 参考代码:
- _714买卖股票的最佳时机含手续费
- 错误经验吸取
原题链接:
714. 买卖股票的最佳时机含手续费
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/description/
完成情况:
解题思路:
Sure, let’s break down the code and explain it step by step.
The problem is to maximize the profit from buying and selling stocks given that there is a transaction fee each time you sell a stock. You can perform as many transactions as you like, but you must sell the stock before you can buy again.
Explanation
-
Initialization:
int n = prices.length; int [][] dp = new int[n][2]; dp[0][0] = 0; dp[0][1] = -prices[0];
n
is the length of the prices array.dp
is a 2D array wheredp[i][0]
represents the maximum profit at dayi
when you don’t have any stock, anddp[i][1]
represents the maximum profit at dayi
when you have one stock.- On day 0, if you don’t own a stock, the profit is 0 (
dp[0][0] = 0
). - On day 0, if you own a stock, the profit is
-prices[0]
because you bought the stock atprices[0]
(dp[0][1] = -prices[0]
).
-
DP Transition:
for (int i = 1; i < n; i++){ dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] + prices[i] - fee); dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] - prices[i]); }
- For each day
i
from 1 ton-1
, we update thedp
array:dp[i][0]
can be obtained by either:- Doing nothing on day
i
, hencedp[i][0] = dp[i-1][0]
. - Selling the stock on day
i
, hencedp[i][0] = dp[i-1][1] + prices[i] - fee
(selling the stock gives the price at dayi
, but we must subtract the transaction fee).
- Doing nothing on day
dp[i][1]
can be obtained by either:- Doing nothing on day
i
, hencedp[i][1] = dp[i-1][1]
. - Buying the stock on day
i
, hencedp[i][1] = dp[i-1][0] - prices[i]
(we subtract the price at dayi
from the profit since we are buying the stock).
- Doing nothing on day
- For each day
-
Result:
return dp[n-1][0];
- At the end of the loop,
dp[n-1][0]
will contain the maximum profit we can achieve on the last day if we don’t own any stock (which is the desired result since we want to end up with no stock to realize the profit).
- At the end of the loop,
Summary
- The algorithm uses dynamic programming to keep track of the maximum profit for each day, considering both states of holding a stock or not holding a stock.
- The transition equations consider the profit from both holding and selling a stock, incorporating the transaction fee.
- Finally, the algorithm returns the maximum profit achievable by the end of the last day when no stock is held.
参考代码:
_714买卖股票的最佳时机含手续费
package leetcode板块;
public class _714买卖股票的最佳时机含手续费 {
/**
*
* @param prices
* @param fee
* @return
*/
public int maxProfit(int[] prices, int fee) {
// 你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。
// 返回获得利润的最大值。
int n = prices.length;
int [][] dp = new int[n][2];
// 0 代表当前股票的空余情况, 1代表当前股票处于抛售的情况
dp[0][0] = 0;
dp[0][1] = -prices[0];
// TODO 交易的过程中,引入卖出时的手续费
for (int i = 1; i < n; i++){
dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1] + prices[i] - fee);
dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0] - prices[i]);
}
return dp[n-1][0];
}
}