Skip to content

Commit 58746c7

Browse files
authored
feat: add solutions to lc problem: No.0188 (doocs#1743)
No.0188.Best Time to Buy and Sell Stock IV
1 parent 9c8ef31 commit 58746c7

File tree

8 files changed

+649
-273
lines changed

8 files changed

+649
-273
lines changed

solution/0100-0199/0188.Best Time to Buy and Sell Stock IV/README.md

Lines changed: 290 additions & 56 deletions
Large diffs are not rendered by default.

solution/0100-0199/0188.Best Time to Buy and Sell Stock IV/README_EN.md

Lines changed: 303 additions & 54 deletions
Large diffs are not rendered by default.
Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
class Solution {
22
public:
33
int maxProfit(int k, vector<int>& prices) {
4-
int dp[k + 1][2];
5-
memset(dp, 0, sizeof(dp));
6-
for (int i = 1; i <= k && !prices.empty(); ++i) {
7-
dp[i][0] = -prices[0];
4+
int n = prices.size();
5+
int f[k + 1][2];
6+
memset(f, 0, sizeof(f));
7+
for (int j = 1; j <= k; ++j) {
8+
f[j][1] = -prices[0];
89
}
9-
for (int i = 1; i < prices.size(); ++i) {
10-
for (int j = 1; j <= k; ++j) {
11-
dp[j][0] = max(dp[j][0], dp[j - 1][1] - prices[i]);
12-
dp[j][1] = max(dp[j][1], dp[j][0] + prices[i]);
10+
for (int i = 1; i < n; ++i) {
11+
for (int j = k; j; --j) {
12+
f[j][0] = max(f[j][1] + prices[i], f[j][0]);
13+
f[j][1] = max(f[j - 1][0] - prices[i], f[j][1]);
1314
}
1415
}
15-
return dp[k][1];
16+
return f[k][0];
1617
}
1718
};
Lines changed: 10 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -1,121 +1,16 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
4-
5-
public class Comparer : IComparer<LinkedListNode<Tuple<int, int>>>
6-
{
7-
public int Compare(LinkedListNode<Tuple<int, int>> left, LinkedListNode<Tuple<int, int>> right)
8-
{
9-
var result = left.Value.Item1.CompareTo(right.Value.Item1);
10-
if (result == 0 && left != right)
11-
{
12-
return left.Value.Item2.CompareTo(right.Value.Item2);
13-
}
14-
return result;
15-
}
16-
}
17-
181
public class Solution {
19-
private SortedSet<LinkedListNode<Tuple<int, int>>> heap = new SortedSet<LinkedListNode<Tuple<int, int>>>(new Comparer());
20-
private LinkedList<Tuple<int, int>> list = new LinkedList<Tuple<int, int>>();
21-
22-
private int lable = 0;
23-
private Tuple<int, int> CreateNodeValue(int value)
24-
{
25-
return Tuple.Create(value, lable++);
26-
}
27-
28-
public int MaxProfitStupid(int k, int[] prices)
29-
{
30-
var f = new int[prices.Length + 1, k + 1];
31-
for (var i = 2; i <= prices.Length; ++i)
32-
{
33-
for (var kk = 1; kk <= k; ++kk)
34-
{
35-
for (var j = 0; j + 1 < i; ++j)
36-
{
37-
f[i, kk] = Math.Max(f[i, kk], Math.Max(Math.Max(f[i, kk - 1], f[i - 1, kk]), f[j, kk - 1] + prices[i - 1] - prices[j]));
38-
}
39-
}
40-
}
41-
return f[prices.Length, k];
42-
}
43-
442
public int MaxProfit(int k, int[] prices) {
45-
var result = 0;
46-
var i = 0;
47-
var profitCount = 0;
48-
var tempList = new List<Tuple<int, bool>>();
49-
while (i + 1 < prices.Length)
50-
{
51-
var highIndex = i;
52-
while (i + 1 < prices.Length && prices[i] >= prices[i + 1])
53-
{
54-
++i;
55-
}
56-
var lowIndex = i;
57-
while (i + 1 < prices.Length && prices[i] <= prices[i + 1])
58-
{
59-
++i;
60-
}
61-
var highIndex2 = i;
62-
63-
if (highIndex != lowIndex)
64-
{
65-
tempList.Add(Tuple.Create(prices[highIndex] - prices[lowIndex], false));
66-
}
67-
if (lowIndex != highIndex2)
68-
{
69-
tempList.Add(Tuple.Create(prices[highIndex2] - prices[lowIndex], true));
70-
result += prices[highIndex2] - prices[lowIndex];
71-
++profitCount;
72-
}
73-
}
74-
75-
// Trim gaps
76-
if (tempList.Any() && tempList.First().Item2 == false)
77-
{
78-
tempList.RemoveAt(0);
79-
}
80-
if (tempList.Any() && tempList.Last().Item2 == false)
81-
{
82-
tempList.RemoveAt(tempList.Count - 1);
3+
int n = prices.Length;
4+
int[,] f = new int[k + 1, 2];
5+
for (int j = 1; j <= k; ++j) {
6+
f[j, 1] = -prices[0];
837
}
84-
85-
foreach (var temp in tempList)
86-
{
87-
var node = list.AddLast(CreateNodeValue(temp.Item1));
88-
heap.Add(node);
89-
}
90-
//Console.WriteLine("profitCount: {0}. tempList size: {1}. Heap size: {2}.", profitCount, tempList.Count, heap.Sum(item =>item.Value.Count));
91-
92-
for (var j = 0; j < profitCount - k; ++j)
93-
{
94-
var node = heap.Min;
95-
result -= node.Value.Item1;
96-
//Console.WriteLine(node.Value);
97-
var previous = node.Previous;
98-
var next = node.Next;
99-
var newValue = (previous == null ? 0 : previous.Value.Item1) + (next == null ? 0 : next.Value.Item1) - node.Value.Item1;
100-
if (previous != null)
101-
{
102-
heap.Remove(previous);
103-
list.Remove(previous);
104-
}
105-
if (next != null)
106-
{
107-
heap.Remove(next);
108-
list.Remove(next);
109-
}
110-
if (previous != null && next != null)
111-
{
112-
var newNode = list.AddBefore(node, CreateNodeValue(newValue));
113-
heap.Add(newNode);
8+
for (int i = 1; i < n; ++i) {
9+
for (int j = k; j > 0; --j) {
10+
f[j, 0] = Math.Max(f[j, 1] + prices[i], f[j, 0]);
11+
f[j, 1] = Math.Max(f[j - 1, 0] - prices[i], f[j, 1]);
11412
}
115-
heap.Remove(node);
116-
list.Remove(node);
11713
}
118-
119-
return result;
14+
return f[k, 0];
12015
}
121-
}
16+
}

solution/0100-0199/0188.Best Time to Buy and Sell Stock IV/Solution.go

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,15 @@
11
func maxProfit(k int, prices []int) int {
2-
n := len(prices)
3-
if n < 2 {
4-
return 0
2+
f := make([][2]int, k+1)
3+
for j := 1; j <= k; j++ {
4+
f[j][1] = -prices[0]
55
}
6-
dp := make([][][]int, n)
7-
for i := 0; i < n; i++ {
8-
dp[i] = make([][]int, k+1)
9-
for j := 0; j <= k; j++ {
10-
dp[i][j] = make([]int, 2)
6+
for _, x := range prices[1:] {
7+
for j := k; j > 0; j-- {
8+
f[j][0] = max(f[j][1]+x, f[j][0])
9+
f[j][1] = max(f[j-1][0]-x, f[j][1])
1110
}
1211
}
13-
for i := 1; i <= k; i++ {
14-
dp[0][i][1] = -prices[0]
15-
}
16-
for i := 1; i < n; i++ {
17-
for j := 1; j <= k; j++ {
18-
dp[i][j][0] = max(dp[i-1][j][1]+prices[i], dp[i-1][j][0])
19-
dp[i][j][1] = max(dp[i-1][j-1][0]-prices[i], dp[i-1][j][1])
20-
}
21-
}
22-
return dp[n-1][k][0]
12+
return f[k][0]
2313
}
2414

2515
func max(a, b int) int {
Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
11
class Solution {
22
public int maxProfit(int k, int[] prices) {
33
int n = prices.length;
4-
if (n <= 1) {
5-
return 0;
6-
}
7-
int[][][] dp = new int[n][k + 1][2];
8-
for (int i = 1; i <= k; ++i) {
9-
dp[0][i][1] = -prices[0];
4+
int[][] f = new int[k + 1][2];
5+
for (int j = 1; j <= k; ++j) {
6+
f[j][1] = -prices[0];
107
}
118
for (int i = 1; i < n; ++i) {
12-
for (int j = 1; j <= k; ++j) {
13-
dp[i][j][0] = Math.max(dp[i - 1][j][1] + prices[i], dp[i - 1][j][0]);
14-
dp[i][j][1] = Math.max(dp[i - 1][j - 1][0] - prices[i], dp[i - 1][j][1]);
9+
for (int j = k; j > 0; --j) {
10+
f[j][0] = Math.max(f[j][1] + prices[i], f[j][0]);
11+
f[j][1] = Math.max(f[j - 1][0] - prices[i], f[j][1]);
1512
}
1613
}
17-
return dp[n - 1][k][0];
14+
return f[k][0];
1815
}
1916
}
Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
class Solution:
22
def maxProfit(self, k: int, prices: List[int]) -> int:
3-
n = len(prices)
4-
if n < 2:
5-
return 0
6-
dp = [[[0] * 2 for _ in range(k + 1)] for _ in range(n)]
7-
for i in range(1, k + 1):
8-
dp[0][i][1] = -prices[0]
9-
for i in range(1, n):
10-
for j in range(1, k + 1):
11-
dp[i][j][0] = max(dp[i - 1][j][1] + prices[i], dp[i - 1][j][0])
12-
dp[i][j][1] = max(dp[i - 1][j - 1][0] - prices[i], dp[i - 1][j][1])
13-
return dp[-1][k][0]
3+
f = [[0] * 2 for _ in range(k + 1)]
4+
for j in range(1, k + 1):
5+
f[j][1] = -prices[0]
6+
for x in prices[1:]:
7+
for j in range(k, 0, -1):
8+
f[j][0] = max(f[j][1] + x, f[j][0])
9+
f[j][1] = max(f[j - 1][0] - x, f[j][1])
10+
return f[k][0]
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
function maxProfit(k: number, prices: number[]): number {
2+
const f = Array.from({ length: k + 1 }, () => Array.from({ length: 2 }, () => 0));
3+
for (let j = 1; j <= k; ++j) {
4+
f[j][1] = -prices[0];
5+
}
6+
for (const x of prices.slice(1)) {
7+
for (let j = k; j; --j) {
8+
f[j][0] = Math.max(f[j][1] + x, f[j][0]);
9+
f[j][1] = Math.max(f[j - 1][0] - x, f[j][1]);
10+
}
11+
}
12+
return f[k][0];
13+
}

0 commit comments

Comments
 (0)