Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

Lines changed: 5 additions & 8 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 41 additions & 0 deletions
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

Lines changed: 37 additions & 0 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 28 additions & 0 deletions
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

Lines changed: 4 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /