Skip to content

Commit 47817b2

Browse files
committed
20190313
1 parent 051dfbf commit 47817b2

File tree

7 files changed

+117
-10
lines changed

7 files changed

+117
-10
lines changed

code/lc121.java

+5-8
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,14 @@
44
* 题意:股票买卖1次,最大利润
55
* 难度:Easy
66
* 分类:Arryas, Dynamic Programming
7-
* Tips:lc122
7+
* Tips:lc121, lc309, lc188, lc123, lc714
88
*/
99
public class lc121 {
1010
public int maxProfit(int[] prices) {
11-
int min = prices[0];if(prices.length==0)
12-
return 0;
13-
int res =0;
14-
for (int i = 1; i < prices.length ; i++) {
15-
res = Math.max(prices[i]-min,res);
16-
if(prices[i]<min)
17-
min = prices[i];
11+
int min = Integer.MAX_VALUE, res=0;
12+
for(int i=0; i<prices.length; i++){
13+
min = Math.min(min, prices[i]);
14+
res = Math.max(res, prices[i]-min);
1815
}
1916
return res;
2017
}

code/lc122.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* 难度:Easy
66
* 分类:Array, Greedy
77
* 思路:计算 prices[i] 与 prices[i-1] 的差值,把正数全加起来就行了
8-
* Tips:lc121, lc309
8+
* Tips:lc121, lc309, lc188, lc123, lc714
99
*/
1010
public class lc122 {
1111
public int maxProfit(int[] prices) {

code/lc123.java

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package code;
2+
/*
3+
* 122. Best Time to Buy and Sell Stock III
4+
* 题意:买卖股票最大利润,只能买卖2次
5+
* 难度:Hard
6+
* 分类:Array, Dynamic Programming
7+
* 思路:两种思路,第一种是分成两块,每块按lc121的算法进行计算,最后合并结果
8+
* 第二种思路设置4个变量,分别为第一次买,第一次卖,第二次买,第二次卖的价格
9+
* Tips:只想到了O(N^2)的方法
10+
* lc121, lc309, lc188, lc123, lc714
11+
*/
12+
public class lc123 {
13+
public int maxProfit(int[] prices) {
14+
int buy1 = Integer.MAX_VALUE, buy2 = Integer.MAX_VALUE, sell1 = 0, sell2 = 0;
15+
for (int i = 0; i < prices.length ; i++) {
16+
buy1 = Math.min(buy1, prices[i]); //第一次购买的最低价格
17+
sell1 = Math.max(sell1, prices[i] - buy1);
18+
buy2 = Math.min(buy2, prices[i]-sell1); //记住第二项 prices[i]-sell1
19+
sell2 = Math.max(sell2, prices[i]-buy2); //当只购买一次时,会传递的
20+
}
21+
return sell2;
22+
}
23+
24+
public int maxProfit2(int[] prices) { //常规方法,分为两块,O(N^2)
25+
int res = 0;
26+
for (int i = 0; i <prices.length ; i++) {
27+
int res1 = Math.max(0, helper(prices,0,i));
28+
int res2 = Math.max(0, helper(prices, i, prices.length));
29+
res = Math.max(res, res1+res2);
30+
}
31+
return res;
32+
}
33+
public int helper(int[] prices, int begin, int end) {
34+
int min = Integer.MAX_VALUE, res=0;
35+
for(int i=begin; i<end; i++){
36+
min = Math.min(min, prices[i]);
37+
res = Math.max(res, prices[i]-min);
38+
}
39+
return res;
40+
}
41+
}

code/lc188.java

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package code;
2+
/*
3+
* 188. Best Time to Buy and Sell Stock IV
4+
* 题意:买卖股票最大利润,可以买卖k次
5+
* 难度:Hard
6+
* 分类:Dynamic Programming
7+
* 思路:二维dp, dp[i][j] 表示i次交易,在数组prices[0~j]上的最大利润
8+
* dp[i][j] = Max( dp[i][j-1], dp[i-1][jj]+prices[j]-prices[jj] ) { jj in range of [0, j-1] }
9+
* = Max( dp[i][j-1], prices[j]+ max(dp[i-1][jj]-prices[jj]) ) 转化为这一步,少了一层循环
10+
* dp[0][j] = 0; dp[i][0] = 0;
11+
* Tips:lc121, lc309, lc188, lc123, lc714
12+
*/
13+
public class lc188 {
14+
public int maxProfit(int k, int[] prices) {
15+
if(prices.length==0) return 0;
16+
int n = prices.length;
17+
//if k >= n/2, then you can make maximum number of transactions.
18+
if (k >= n/2) {
19+
int maxPro = 0;
20+
for (int i = 1; i < n; i++) {
21+
if (prices[i] > prices[i-1])
22+
maxPro += prices[i] - prices[i-1];
23+
}
24+
return maxPro;
25+
}
26+
27+
int[][] dp = new int[k+1][prices.length];
28+
for (int i = 1; i <= k ; i++) {
29+
int localMax = -prices[0];
30+
for (int j = 1; j < prices.length ; j++) { //jj的计算和这一维合并,总的复杂度是二次方而不是三次
31+
dp[i][j] = Math.max(dp[i][j-1], prices[j]+localMax);
32+
localMax = Math.max(localMax, dp[i-1][j]-prices[j]);
33+
}
34+
}
35+
return dp[k][prices.length-1];
36+
}
37+
}

code/lc309.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* sell[i] = max( sell[i-1], buy[i-1]+price[i] )
1010
* 空间压缩以后时间是O(n),空间是O(1)
1111
* Tips:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/discuss/75931/Easiest-JAVA-solution-with-explanations
12-
* lc122
12+
* lc121, lc309, lc188, lc123, lc714
1313
*/
1414
public class lc309 {
1515
public int maxProfit(int[] prices) {

code/lc714.java

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package code;
2+
/*
3+
* 714. Best Time to Buy and Sell Stock with Transaction Fee
4+
* 题意:买卖股票,不限次数,但有交易费用,求最大利润
5+
* 难度:Medium
6+
* 分类:Array, Dynamic Programming, Greedy
7+
* 思路:和309思路一致,每次卖出的时候减去交易费用
8+
* buy[i] = max( buy[i-1], sell[i-1]-price[i] )
9+
* sell[i] = max( sell[i-1], buy[i-1]+price[i]-2 )
10+
* Tips:
11+
* 总结一下买卖股票的问题 交易1次,2次,任意多次都可在O(N)完成交易
12+
* 交易k次时,时间复杂度为O(NM),M为交易次数
13+
* 冷却时间和交易费用的解法一致,都是分买和卖两个状态,进行dp
14+
*/
15+
public class lc714 {
16+
public int maxProfit(int[] prices, int fee) {
17+
if(prices.length==0) return 0;
18+
int b1 = -prices[0];
19+
int s1=0, b = 0, s = 0;
20+
for (int i = 0; i < prices.length ; i++) {
21+
b = Math.max(b1, s1-prices[i]);
22+
s = Math.max(s1, b1+prices[i]-fee);
23+
s1 = s;
24+
b1 = b;
25+
}
26+
return Math.max(s,b);
27+
}
28+
}

readme.md

+4
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ LeetCode 指南
4545
| 021 [Java](./code/lc21.java)
4646
| 022 [Java](./code/lc22.java)
4747
| 023 [Java](./code/lc23.java)
48+
| 024 [Java](./code/lc24.java)
4849
| 026 [Java](./code/lc26.java)
50+
| 027 [Java](./code/lc27.java)
4951
| 028 [Java](./code/lc28.java)
5052
| 029 [Java](./code/lc29.java)
5153
| 031 [Java](./code/lc31.java)
@@ -96,6 +98,7 @@ LeetCode 指南
9698
| 114 [Java](./code/lc114.java)
9799
| 116 [Java](./code/lc116.java)
98100
| 118 [Java](./code/lc118.java)
101+
| 120 [Java](./code/lc120.java)
99102
| 121 [Java](./code/lc121.java)
100103
| 122 [Java](./code/lc122.java)
101104
| 124 [Java](./code/lc124.java)
@@ -138,6 +141,7 @@ LeetCode 指南
138141
| 208 [Java](./code/lc208.java)
139142
| 210 [Java](./code/lc210.java)
140143
| 212 [Java](./code/lc212.java)
144+
| 213 [Java](./code/lc213.java)
141145
| 215 [Java](./code/lc215.java)
142146
| 217 [Java](./code/lc217.java)
143147
| 218 [Java](./code/lc215.java)

0 commit comments

Comments
 (0)