代码随想录二刷Day50
今日任务
123.买卖股票的最佳时机III
188.买卖股票的最佳时机IV
语言:Go
123. 买卖股票的最佳时机III
链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/
dp数组可优化为长度为5的数组,空间复杂度为O(1)
func max(i, j int) int {
if i < j {
return j
} else {
return i
}
}
func maxProfit(prices []int) int {
//0:还未进行过交易
//1:第一笔交易买入
//2:第一笔交易卖出
//3:第二笔交易买入
//4:第二笔交易卖出
dp := make([][5]int, len(prices))
dp[0][1] = -prices[0]
dp[0][3] = -prices[0]
for i := 1; i < len(prices); i++ {
dp[i][0] = dp[i - 1][0]
dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1])
dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])
dp[i][3] = max(dp[i - 1][2] - prices[i], dp[i - 1][3])
dp[i][4] = max(dp[i - 1][3] + prices[i], dp[i - 1][4])
}
idx := len(prices) - 1
return max(dp[idx][0], max(max(dp[idx][1], dp[idx][2]), max(dp[idx][3], dp[idx][4])))
}
188. 买卖股票的最佳时机IV
链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/
func max(i, j int) int {
if i < j {
return j
} else {
return i
}
}
func maxProfit(k int, prices []int) int {
dp := make([]int, k * 2 + 1)
//偶数:未交易/卖出
//奇数:买入
for i := 0; i < k * 2 + 1; i++ {
if i % 2 == 1 {
dp[i] = -prices[0]
}
}
for i := 1; i < len(prices); i++ {
for j := 1; j < k * 2 + 1; j++ {
if j % 2 == 1 {
dp[j] = max(dp[j - 1] - prices[i], dp[j])
} else {
dp[j] = max(dp[j - 1] + prices[i], dp[j])
}
}
}
ret := dp[0]
for i := 0; i < k * 2 + 1; i++ {
if dp[i] > ret {
ret = dp[i]
}
}
return ret
}
版权声明:本文为weixin_38255385原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。