File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments