714. 买卖股票的最佳时机含手续费 – 动态规划
本文最后更新于 366 天前,其中的信息可能已经有所发展或是发生改变。

题目描述:

给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。

你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。

返回获得利润的最大值。

**注意:**这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

示例 1:

输入:prices = [1, 3, 2, 8, 4, 9], fee = 2
输出:8
解释:能够达到的最大利润:  
在此处买入 prices[0] = 1
在此处卖出 prices[3] = 8
在此处买入 prices[4] = 4
在此处卖出 prices[5] = 9
总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8

示例 2:

输入:prices = [1,3,7,5,10,3], fee = 3
输出:6

提示:

  • 1 <= prices.length <= 5 * 10^4
  • 1 <= prices[i] < 5 * 10^4
  • 0 <= fee < 5 * 10^4

解法一:动态规划

算法思路:

本题与 122. 买卖股票的最佳时机 II – 贪心&动态规划 解法类似,不同之处在于卖出时要支付手续费:

定义dp[i][j]表示第 i 天,持有股票状态为 j 时,能够获得的最大利润,其中 j = 0时表示不持有股票,j = 1 时表示持有股票。

初始时,dp[0][0] = 0,dp[0][1] = -prices[0]

i > 0 时,有以下两种情况:

  • i 天不持有股票,可能是第 i - 1 天不持有股票且在第 i 天不进行任何操作,或者在第 i - 1 天持有股票且在第 i 天卖出,因此 dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i] - fee)
  • i 天持有股票,可能是第 i - 1 天持有股票且在第 i 天不进行任何操作,或者在第 i - 1 天不持有股票且在第 i 天买入,因此 dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i])

综上得到状态转移方程: $$ dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i] – fee) $$

$$ dp[i][1] = max(dp[i-1][1], dp[i-1][0] – prices[i]) $$

答案即为 dp[n-1][0]

代码实现:

class Solution {
    public int maxProfit(int[] prices, int fee) {
        int n = prices.length;
        int[][] dp = new int[n][2];
        dp[0][1] = -prices[0];
        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];
    }
}

由于dp[i][]的转移只和dp[i-1][]有关,因此可以使用两个变量 dp0dp1 来代替数组 dp,优化空间复杂度:

class Solution {
    public int maxProfit(int[] prices, int fee) {
        int dp0 = 0, dp1 = -prices[0];
        for(int i = 1; i < prices.length; i++){
            int temp = Math.max(dp0, dp1 + prices[i] - fee);
            dp1 = Math.max(dp1, dp0 - prices[i]);
            dp0 = temp;
        }
        return dp0;
    }
}

复杂度分析:

时间复杂度: O(n),其中 n 为数组 prices 的长度。

空间复杂度: O(1)。

相关链接

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇