mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-06 15:09:40 +08:00
Merge pull request #2712 from feobay/master
添加了0188.买卖股票的最佳时机IV和0309.最佳买卖股票时机含冷冻期Go语言空间优化版本
This commit is contained in:
@ -404,6 +404,47 @@ func max188(a, b int) int {
|
||||
}
|
||||
```
|
||||
|
||||
版本三:空间优化版本
|
||||
|
||||
```go
|
||||
func maxProfit(k int, prices []int) int {
|
||||
n := len(prices)
|
||||
// k次交易,2 * k种状态
|
||||
// 状态从1开始计算,避免判断
|
||||
// 奇数时持有(保持或买入)
|
||||
// 偶数时不持有(保持或卖出)
|
||||
dp := make([][]int, 2)
|
||||
dp[0] = make([]int, k * 2 + 1)
|
||||
dp[1] = make([]int, k * 2 + 1)
|
||||
|
||||
// 奇数状态时持有,i += 2
|
||||
for i := 1; i <= k * 2; i += 2 {
|
||||
dp[0][i] = -prices[0]
|
||||
}
|
||||
|
||||
for i := 1; i < len(prices); i++ {
|
||||
for j := 1; j <= k * 2; j++ {
|
||||
if j % 2 == 1 {
|
||||
dp[i % 2][j] = max(dp[(i - 1) % 2][j], dp[(i - 1) % 2][j - 1] - prices[i])
|
||||
} else {
|
||||
dp[i % 2][j] = max(dp[(i - 1) % 2][j], dp[(i - 1) % 2][j - 1] + prices[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return dp[(n - 1) % 2][k * 2]
|
||||
}
|
||||
|
||||
func max(a, b int) int {
|
||||
if a > b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
### JavaScript:
|
||||
|
||||
```javascript
|
||||
@ -558,3 +599,4 @@ impl Solution {
|
||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||
</a>
|
||||
|
||||
|
@ -357,6 +357,42 @@ func max(a, b int) int {
|
||||
}
|
||||
```
|
||||
|
||||
```go
|
||||
// 一维优化版本
|
||||
// 时间复杂度O(n), 空间复杂度O(1)
|
||||
func maxProfit(prices []int) int {
|
||||
|
||||
// 0: 持有,一直持有和买入
|
||||
// 1: 不持有,一直不持有(不包含前一天卖出,因为这样的一天是冷静期,状态有区别)
|
||||
// 2:不持有,今天卖出
|
||||
// 3:冷静期,前一天卖出(一直不持有)
|
||||
dp0, dp1, dp2, dp3 := -prices[0], 0, 0, 0
|
||||
|
||||
n := len(prices)
|
||||
|
||||
for i := 1; i < n; i++ {
|
||||
t0 := max(dp0, max(dp1, dp3)-prices[i])
|
||||
t1 := max(dp1, dp3)
|
||||
t2 := dp0 + prices[i]
|
||||
t3 := dp2
|
||||
|
||||
// 更新
|
||||
dp0, dp1, dp2, dp3 = t0, t1, t2, t3
|
||||
}
|
||||
|
||||
return max(dp1, max(dp2, dp3))
|
||||
}
|
||||
|
||||
func max(a, b int) int {
|
||||
if a > b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
### Javascript:
|
||||
|
||||
> 不同的状态定义 感觉更容易理解些
|
||||
@ -540,3 +576,4 @@ impl Solution {
|
||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||
</a>
|
||||
|
||||
|
Reference in New Issue
Block a user