Day 37

Best Time to Buy and Sell Stock

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public int maxProfit(int[] prices) {
int[][] dp = new int[prices.length][2];
dp[0][0] = -prices[0];
dp[0][1] = 0;

for (int i = 1; i < prices.length; i++) {
// ith day maximum profit with stock, not buy or buy
dp[i][0] = Math.max(dp[i - 1][0], -prices[i]);
// ith day maximum profit without stock, not sell or sell
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
}

// last day sell stock, maximun profit
return dp[prices.length - 1][1];
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
func maxProfit(prices []int) int {
dp := make([][]int, len(prices))
for i := 0; i < len(prices); i++ {
dp[i] = make([]int, 2)
}

dp[0][0] = -prices[0]
dp[0][1] = 0

for i := 1; i < len(prices); i++ {
dp[i][0] = max(dp[i-1][0], -prices[i])
dp[i][1] = max(dp[i-1][1], dp[i-1][0]+prices[i])
}
return dp[len(prices)-1][1]
}

func max(a, b int) int {
if a > b {
return a
}
return b
}

Best Time to Buy and Sell Stock II

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public int maxProfit(int[] prices) {
// int res = 0;
// for (int i = 1; i < prices.length; i++) {
// res += Math.max(prices[i] - prices[i - 1], 0);
// }
// return res;

int[][] dp = new int[prices.length][2];
dp[0][0] = -prices[0];
dp[0][1] = 0;

for (int i = 1; i < prices.length; i++) {
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
}

return dp[prices.length - 1][1];
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func maxProfit(prices []int) int {
dp := make([][]int, len(prices))
for i := 0; i < len(prices); i++ {
dp[i] = make([]int, 2)
}

dp[0][0] = -prices[0]
dp[0][1] = 0

for i := 1; i < len(prices); i++ {
dp[i][0] = max(dp[i-1][0], dp[i-1][1]-prices[i])
dp[i][1] = max(dp[i-1][1], dp[i-1][0]+prices[i])
}
return dp[len(prices)-1][1]
}

func max(a, b int) int {
if a > b {
return a
}
return b
}

Best Time to Buy and Sell Stock III

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int maxProfit(int[] prices) {
int[] dp = new int[5];
dp[1] = -prices[0];
dp[3] = -prices[0];

for (int i = 1; i < prices.length; i++) {
dp[1] = Math.max(dp[1], dp[0] - prices[i]);
dp[2] = Math.max(dp[2], dp[1] + prices[i]);
dp[3] = Math.max(dp[3], dp[2] - prices[i]);
dp[4] = Math.max(dp[4], dp[3] + prices[i]);
}
return dp[4];
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func maxProfit(prices []int) int {
if len(prices) == 0 {
return 0
}
dp := make([]int, 5)
dp[1] = -prices[0]
dp[3] = -prices[0]
for i := 1; i < len(prices); i++ {
dp[1] = max(dp[1], dp[0]-prices[i])
dp[2] = max(dp[2], dp[1]+prices[i])
dp[3] = max(dp[3], dp[2]-prices[i])
dp[4] = max(dp[4], dp[3]+prices[i])
}
return dp[4]
}

func max(x, y int) int {
if x > y {
return x
}
return y
}