代码随想录算法训练营第四十天-188买卖股票的最佳时机IV、309最佳买卖股票时机含冷冻期、714买卖股票的最佳时机含手续费
Kiml Lv5
  • 前言
    状态:188 根据 123AC 了。309用另一种方法AC了。714AC。

  • 更新

1
24-06-28 初始记录

初步题解

188 买卖股票的最佳时机 IV

题目链接:(https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public int maxProfit(int k, int[] prices) {  
int[][] dp = new int[prices.length][2 * k];

// 初始化数据
for (int i = 0; i < k; i++) {
dp[0][i * 2] = -prices[0];
}

for (int i = 1; i < dp.length; i++) {
dp[i][0] = Math.max(dp[i - 1][0], -prices[i]);
for (int j = 1; j < 2 * k; j++) {
if (j % 2 == 0) {
// 偶数买入
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 1] - prices[i]);
} else {
// 奇数卖出
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 1] + prices[i]);
}
}
}

System.out.println(Arrays.deepToString(dp));

return dp[prices.length - 1][2 * k - 1];
}

309 最佳买卖股票时机含冷冻期

题目链接:(https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown)

思路:买卖股票 + 打家劫舍结合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public int maxProfit(int[] prices) {  
// 0 表示持有股票的状态; 1 表示不持有股票的状态
int[][] dp = new int[prices.length][2];

dp[0][0] = -prices[0];

for (int i = 1; i < dp.length; i++) {
if (i == 1) {
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
} else {
// 持有:前一天持有;前一天不持有(不可能):前两天不持有
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 2][1] - prices[i]);
}
// 不持有:前一天不持有;前一天持有
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
}

System.out.println(Arrays.deepToString(dp));

return dp[prices.length - 1][1];
}

714 买卖股票的最佳时机含手续费

题目链接:(https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 加上手续费就行
public int maxProfit(int[] prices, int fee) {
int[][] dp = new int[prices.length][2];

// 假设买入的时候支付手续费
dp[0][0] = -prices[0] - fee;

for (int i = 1; i < dp.length; 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]);
}

System.out.println(Arrays.deepToString(dp));

return dp[prices.length - 1][1];
}

看解析

188 买卖股票的最佳时机 IV

解析:(https://programmercarl.com/0188.买卖股票的最佳时机IV.html)

309 最佳买卖股票时机含冷冻期

解析:(https://programmercarl.com/0309.最佳买卖股票时机含冷冻期.html)

注意这里的每一个状态,例如状态一,是持有股票股票状态并不是说今天一定就买入股票,而是说保持买入股票的状态即:可能是前几天买入的,之后一直没操作,所以保持买入股票的状态

达到买入股票状态(状态一)即:dp[i][0],有两个具体操作:

  • 操作一:前一天就是持有股票状态(状态一),dp[i][0] = dp[i - 1][0]

  • 操作二:今天买入了,有两种情况

    • 前一天是冷冻期(状态四),dp[i - 1][3] - prices[i]
    • 前一天是保持卖出股票的状态(状态二),dp[i - 1][1] - prices[i]

那么 dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]);

达到保持卖出股票状态(状态二)即:dp[i][1],有两个具体操作:

  • 操作一:前一天就是状态二

  • 操作二:前一天是冷冻期(状态四),dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);

达到今天就卖出股票状态(状态三),即:dp[i][2],只有一个操作:

昨天一定是持有股票状态(状态一),今天卖出,即:dp[i][2] = dp[i - 1][0] + prices[i];

达到冷冻期状态(状态四),即:dp[i][3],只有一个操作:

昨天卖出了股票(状态三), dp[i][3] = dp[i - 1][2];

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public int maxProfit(int[] prices) {
if (prices == null || prices.length < 2) {
return 0;
}
int[][] dp = new int[prices.length][2];

// bad case
dp[0][0] = 0;
dp[0][1] = -prices[0];
dp[1][0] = Math.max(dp[0][0], dp[0][1] + prices[1]);
dp[1][1] = Math.max(dp[0][1], -prices[1]);

for (int i = 2; i < prices.length; i++) {
// dp公式
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 2][0] - prices[i]);
}

return dp[prices.length - 1][0];
}
}

714 买卖股票的最佳时机含手续费

解析:(https://programmercarl.com/0714.买卖股票的最佳时机含手续费(动态规划).html)

 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
访客数 访问量