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

  1. 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 where dp[i][0] represents the maximum profit at day i when you don’t have any stock, and dp[i][1] represents the maximum profit at day i 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 at prices[0] (dp[0][1] = -prices[0]).
  2. 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 to n-1, we update the dp array:
      • dp[i][0] can be obtained by either:
        • Doing nothing on day i, hence dp[i][0] = dp[i-1][0].
        • Selling the stock on day i, hence dp[i][0] = dp[i-1][1] + prices[i] - fee (selling the stock gives the price at day i, but we must subtract the transaction fee).
      • dp[i][1] can be obtained by either:
        • Doing nothing on day i, hence dp[i][1] = dp[i-1][1].
        • Buying the stock on day i, hence dp[i][1] = dp[i-1][0] - prices[i] (we subtract the price at day i from the profit since we are buying the stock).
  3. 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).

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];
    }
}

错误经验吸取

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值