Skip to content

Commit 575dfd4

Browse files
Merge pull request #2712 from feobay/master
添加了0188.买卖股票的最佳时机IV和0309.最佳买卖股票时机含冷冻期Go语言空间优化版本
2 parents d0ff428 + f38dc8a commit 575dfd4

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

problems/0188.买卖股票的最佳时机IV.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,47 @@ func max188(a, b int) int {
404404
}
405405
```
406406

407+
版本三:空间优化版本
408+
409+
```go
410+
func maxProfit(k int, prices []int) int {
411+
n := len(prices)
412+
// k次交易,2 * k种状态
413+
// 状态从1开始计算,避免判断
414+
// 奇数时持有(保持或买入)
415+
// 偶数时不持有(保持或卖出)
416+
dp := make([][]int, 2)
417+
dp[0] = make([]int, k * 2 + 1)
418+
dp[1] = make([]int, k * 2 + 1)
419+
420+
// 奇数状态时持有,i += 2
421+
for i := 1; i <= k * 2; i += 2 {
422+
dp[0][i] = -prices[0]
423+
}
424+
425+
for i := 1; i < len(prices); i++ {
426+
for j := 1; j <= k * 2; j++ {
427+
if j % 2 == 1 {
428+
dp[i % 2][j] = max(dp[(i - 1) % 2][j], dp[(i - 1) % 2][j - 1] - prices[i])
429+
} else {
430+
dp[i % 2][j] = max(dp[(i - 1) % 2][j], dp[(i - 1) % 2][j - 1] + prices[i])
431+
}
432+
}
433+
}
434+
435+
return dp[(n - 1) % 2][k * 2]
436+
}
437+
438+
func max(a, b int) int {
439+
if a > b {
440+
return a
441+
}
442+
return b
443+
}
444+
```
445+
446+
447+
407448
### JavaScript:
408449

409450
```javascript
@@ -558,3 +599,4 @@ impl Solution {
558599
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
559600
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
560601
</a>
602+

problems/0309.最佳买卖股票时机含冷冻期.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,42 @@ func max(a, b int) int {
357357
}
358358
```
359359

360+
```go
361+
// 一维优化版本
362+
// 时间复杂度O(n), 空间复杂度O(1)
363+
func maxProfit(prices []int) int {
364+
365+
// 0: 持有,一直持有和买入
366+
// 1: 不持有,一直不持有(不包含前一天卖出,因为这样的一天是冷静期,状态有区别)
367+
// 2:不持有,今天卖出
368+
// 3:冷静期,前一天卖出(一直不持有)
369+
dp0, dp1, dp2, dp3 := -prices[0], 0, 0, 0
370+
371+
n := len(prices)
372+
373+
for i := 1; i < n; i++ {
374+
t0 := max(dp0, max(dp1, dp3)-prices[i])
375+
t1 := max(dp1, dp3)
376+
t2 := dp0 + prices[i]
377+
t3 := dp2
378+
379+
// 更新
380+
dp0, dp1, dp2, dp3 = t0, t1, t2, t3
381+
}
382+
383+
return max(dp1, max(dp2, dp3))
384+
}
385+
386+
func max(a, b int) int {
387+
if a > b {
388+
return a
389+
}
390+
return b
391+
}
392+
```
393+
394+
395+
360396
### Javascript:
361397

362398
> 不同的状态定义 感觉更容易理解些
@@ -540,3 +576,4 @@ impl Solution {
540576
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
541577
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
542578
</a>
579+

0 commit comments

Comments
 (0)