随想录日记part40
t i m e : time: time: 2024.04.10
主要内容:今天开始要学习动态规划的相关知识了,今天的内容主要涉及:
买卖股票的最佳时机加强版。
- 123.买卖股票的最佳时机III
- 188.买卖股票的最佳时机IV
动态规划五部曲:
【1】.确定dp数组以及下标的含义
【2】.确定递推公式
【3】.dp数组如何初始化
【4】.确定遍历顺序
【5】.举例推导dp数组
Topic1买卖股票的最佳时机|||
思路:
class Solution {
class Solution {
public int maxProfit(int[] prices) {
// 定义dp
int len = prices.length;
int[][] dp = new int[len][5];
// 初始化
dp[0][1] = -prices[0];
dp[0][3] = -prices[0];
// 状态转移
for (int i = 1; i < len; i++) {
dp[i][0] = dp[i - 1][0];
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
dp[i][2] = Math.max(dp[i - 1][1] + prices[i], dp[i - 1][2]);
dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
dp[i][4] = Math.max(dp[i - 1][3] + prices[i], dp[i - 1][4]);
}
return dp[len - 1][4];
}
}
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
n
∗
5
)
O(n*5)
O(n∗5)
Topic2买卖股票的最佳时机IV
题目:
思路:
class Solution {
public int maxProfit(int k, int[] prices) {
// 定义dp
int len = prices.length;
int[][] dp = new int[len][2 * k + 1];
// 初始化
for (int i = 1; i < 2 * k + 1; i = i + 2) {
dp[0][i] = -prices[0];
}
for (int i = 1; i < len; i++) {
for (int j = 0; j < 2 * k - 1; j = j + 2) {
dp[i][j + 1] = Math.max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]);
dp[i][j + 2] = Math.max(dp[i - 1][j + 1] + prices[i], dp[i - 1][j + 2]);
}
}
return dp[len - 1][2 * k];
}
}
时间复杂度:
O
(
n
∗
k
)
O(n*k)
O(n∗k)
空间复杂度:
O
(
n
∗
k
)
O(n*k)
O(n∗k)