Skip to content

Commit 6b33b31

Browse files
author
xutao
committed
提交全系股票DP
1 parent 6980824 commit 6b33b31

7 files changed

Lines changed: 180 additions & 0 deletions

File tree

Week06/MaxProfit.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/**
2+
* 121 股票最大和 =》见第二题的转化
3+
*/
4+
class MaxProfit {
5+
public int maxProfit(int[] prices) {
6+
int length = prices.length;
7+
int dp_i_0 = 0;
8+
int dp_i_1 = -Integer.MAX_VALUE;
9+
for (int i = 0; i < length; i++) {
10+
int temp = dp_i_0;
11+
dp_i_0 = Math.max(temp, dp_i_1 + prices[i]);
12+
dp_i_1 = Math.max(dp_i_1, prices[i]);
13+
}
14+
return dp_i_0;
15+
}
16+
}

Week06/MaxProfit2.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/**
2+
* 122 股票最大和II 。可以无限交易
3+
*/
4+
class MaxProfit2 {
5+
public int maxProfit(int[] prices) {
6+
int length = prices.length;
7+
if (length == 0) {
8+
return 0;
9+
}
10+
int dp[][] = new int[length + 1][2];
11+
dp[1][0] = 0;
12+
dp[1][1] = -prices[0];
13+
for (int i = 2; i <= length; i++) {
14+
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i - 1]);
15+
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i - 1]);
16+
}
17+
return dp[length][0];
18+
}
19+
20+
21+
/**
22+
* 使用滑动数组解决问题
23+
*/
24+
public int maxProfit2(int[] prices) {
25+
int length = prices.length;
26+
int dp[][] = new int[length + 1][2];
27+
dp[0][1] = -Integer.MAX_VALUE;
28+
for (int i = 1; i <= length; i++) {
29+
int temp = dp[i - 1][0];
30+
dp[i][0] = Math.max(temp, dp[i - 1][1] + prices[i - 1]);
31+
dp[i][1] = Math.max(dp[i - 1][1], temp - prices[i - 1]);
32+
}
33+
return dp[length][0];
34+
}
35+
36+
37+
/**
38+
* 使用最终O(1)的空间解决问题
39+
*/
40+
public int maxProfit3(int[] prices) {
41+
int length = prices.length;
42+
int dp_i_0 = 0;
43+
int dp_i_1 = -Integer.MAX_VALUE;
44+
for (int i = 0; i < length; i++) {
45+
int temp = dp_i_0;
46+
dp_i_0 = Math.max(temp, dp_i_1 + prices[i]);
47+
dp_i_1 = Math.max(dp_i_1, temp - prices[i]);
48+
}
49+
return dp_i_0;
50+
}
51+
52+
}

Week06/MaxProfit3.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* 123 股票最大和 ,含1回合cd
3+
*/
4+
class MaxProfit3 {
5+
public int maxProfit(int[] prices) {
6+
int length = prices.length;
7+
int dp_i_0 = 0, dp_pre_0 = 0;
8+
int dp_i_1 = Integer.MIN_VALUE;
9+
for (int i = 0; i < length; i++) {
10+
int temp = dp_i_0;
11+
dp_i_0 = Math.max(dp_i_0, dp_i_1 + prices[i]);
12+
dp_i_1 = Math.max(dp_i_1, dp_pre_0 - prices[i]);
13+
dp_pre_0 = temp;
14+
}
15+
return dp_i_0;
16+
}
17+
}

Week06/MaxProfit4.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/**
2+
* 714 股票最大和 含手续费
3+
*/
4+
class MaxProfit4 {
5+
public int maxProfit(int[] prices, int fee) {
6+
int length = prices.length;
7+
int dp_i_0 = 0;
8+
int dp_i_1 = Integer.MIN_VALUE;
9+
for (int i = 0; i < length; i++) {
10+
int temp = dp_i_0;
11+
dp_i_0 = Math.max(dp_i_0, dp_i_1 + prices[i]);
12+
dp_i_1 = Math.max(dp_i_1, temp - prices[i] - fee);
13+
}
14+
return dp_i_0;
15+
}
16+
}

Week06/MaxProfit5.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* k=2 习题123,最多交易2笔
3+
*/
4+
class MaxProfit5 {
5+
public int maxProfit(int[] prices, int fee) {
6+
int length = prices.length;
7+
int dp_i_1_0 = 0, dp_i_2_0 = 0;
8+
int dp_i_1_1 = Integer.MIN_VALUE, dp_i_2_1 = Integer.MIN_VALUE;
9+
for (int i = 0; i < length; i++) {
10+
dp_i_2_0 = Math.max(dp_i_2_0, dp_i_2_1 + prices[i]);
11+
dp_i_2_1 = Math.max(dp_i_2_1, dp_i_1_0 - prices[i]);
12+
dp_i_1_0 = Math.max(dp_i_1_0, dp_i_1_1 + prices[i]);
13+
dp_i_1_1 = Math.max(dp_i_1_1, -prices[i]);
14+
}
15+
return dp_i_2_0;
16+
}
17+
}

Week06/MaxProfit6.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/**
2+
* k=any 188交易股票 暂时超时
3+
*/
4+
class MaxProfit6 {
5+
public int maxProfit(int k, int[] prices) {
6+
int length = prices.length;
7+
if (k > length / 2) {
8+
return maxProfitInf(prices, length);
9+
} else {
10+
return maxProfitAny(prices, k, length);
11+
}
12+
}
13+
14+
public int maxProfitAny(int[] prices, int k, int length) {
15+
int dp[][][] = new int[length ][k+1][2];
16+
for (int i = 0; i <= length; i++) {
17+
for (int j = k; j >= 1; k--) {
18+
if (i == 0) {
19+
/** 处理基础值*/
20+
dp[i][j][0] = 0;
21+
dp[i][j][1] = Integer.MIN_VALUE;
22+
continue;
23+
}
24+
dp[i][j][0] = Math.max(dp[i - 1][j][0], dp[i - 1][j][1] + prices[i]);
25+
dp[i][j][1] = Math.max(dp[i - 1][j][1], dp[i - 1][j - 1][0] - prices[i]);
26+
}
27+
}
28+
return dp[length-1][k][0];
29+
}
30+
31+
/**
32+
* 使用最终O(1)的空间解决问题
33+
*/
34+
public int maxProfitInf(int[] prices, int length) {
35+
int dp_i_0 = 0;
36+
int dp_i_1 = -Integer.MAX_VALUE;
37+
for (int i = 0; i < length; i++) {
38+
int temp = dp_i_0;
39+
dp_i_0 = Math.max(temp, dp_i_1 + prices[i]);
40+
dp_i_1 = Math.max(dp_i_1, temp - prices[i]);
41+
}
42+
return dp_i_0;
43+
}
44+
45+
}

Week06/MaxSubArray.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
2+
/**
3+
* 最长子序列和 53
4+
*/
5+
class MaxSubArray {
6+
public int maxSubArray(int[] nums) {
7+
int max = nums[0];
8+
for (int i = 1; i < nums.length; i++) {
9+
int prev = nums[i - 1] > 0 ? nums[i - 1] : 0;
10+
nums[i] += prev;
11+
if (nums[i] > max) {
12+
max = nums[i];
13+
}
14+
}
15+
return max;
16+
}
17+
}

0 commit comments

Comments
 (0)