提交 47817b2e 编写于 作者: L liu13

20190313

上级 051dfbf2
......@@ -4,17 +4,14 @@ package code;
* 题意:股票买卖1次,最大利润
* 难度:Easy
* 分类:Arryas, Dynamic Programming
* Tips:lc122
* Tips:lc121, lc309, lc188, lc123, lc714
*/
public class lc121 {
public int maxProfit(int[] prices) {
int min = prices[0];if(prices.length==0)
return 0;
int res =0;
for (int i = 1; i < prices.length ; i++) {
res = Math.max(prices[i]-min,res);
if(prices[i]<min)
min = prices[i];
int min = Integer.MAX_VALUE, res=0;
for(int i=0; i<prices.length; i++){
min = Math.min(min, prices[i]);
res = Math.max(res, prices[i]-min);
}
return res;
}
......
......@@ -5,7 +5,7 @@ package code;
* 难度:Easy
* 分类:Array, Greedy
* 思路:计算 prices[i] 与 prices[i-1] 的差值,把正数全加起来就行了
* Tips:lc121, lc309
* Tips:lc121, lc309, lc188, lc123, lc714
*/
public class lc122 {
public int maxProfit(int[] prices) {
......
package code;
/*
* 122. Best Time to Buy and Sell Stock III
* 题意:买卖股票最大利润,只能买卖2次
* 难度:Hard
* 分类:Array, Dynamic Programming
* 思路:两种思路,第一种是分成两块,每块按lc121的算法进行计算,最后合并结果
* 第二种思路设置4个变量,分别为第一次买,第一次卖,第二次买,第二次卖的价格
* Tips:只想到了O(N^2)的方法
* lc121, lc309, lc188, lc123, lc714
*/
public class lc123 {
public int maxProfit(int[] prices) {
int buy1 = Integer.MAX_VALUE, buy2 = Integer.MAX_VALUE, sell1 = 0, sell2 = 0;
for (int i = 0; i < prices.length ; i++) {
buy1 = Math.min(buy1, prices[i]); //第一次购买的最低价格
sell1 = Math.max(sell1, prices[i] - buy1);
buy2 = Math.min(buy2, prices[i]-sell1); //记住第二项 prices[i]-sell1
sell2 = Math.max(sell2, prices[i]-buy2); //当只购买一次时,会传递的
}
return sell2;
}
public int maxProfit2(int[] prices) { //常规方法,分为两块,O(N^2)
int res = 0;
for (int i = 0; i <prices.length ; i++) {
int res1 = Math.max(0, helper(prices,0,i));
int res2 = Math.max(0, helper(prices, i, prices.length));
res = Math.max(res, res1+res2);
}
return res;
}
public int helper(int[] prices, int begin, int end) {
int min = Integer.MAX_VALUE, res=0;
for(int i=begin; i<end; i++){
min = Math.min(min, prices[i]);
res = Math.max(res, prices[i]-min);
}
return res;
}
}
package code;
/*
* 188. Best Time to Buy and Sell Stock IV
* 题意:买卖股票最大利润,可以买卖k次
* 难度:Hard
* 分类:Dynamic Programming
* 思路:二维dp, dp[i][j] 表示i次交易,在数组prices[0~j]上的最大利润
* dp[i][j] = Max( dp[i][j-1], dp[i-1][jj]+prices[j]-prices[jj] ) { jj in range of [0, j-1] }
* = Max( dp[i][j-1], prices[j]+ max(dp[i-1][jj]-prices[jj]) ) 转化为这一步,少了一层循环
* dp[0][j] = 0; dp[i][0] = 0;
* Tips:lc121, lc309, lc188, lc123, lc714
*/
public class lc188 {
public int maxProfit(int k, int[] prices) {
if(prices.length==0) return 0;
int n = prices.length;
//if k >= n/2, then you can make maximum number of transactions.
if (k >= n/2) {
int maxPro = 0;
for (int i = 1; i < n; i++) {
if (prices[i] > prices[i-1])
maxPro += prices[i] - prices[i-1];
}
return maxPro;
}
int[][] dp = new int[k+1][prices.length];
for (int i = 1; i <= k ; i++) {
int localMax = -prices[0];
for (int j = 1; j < prices.length ; j++) { //jj的计算和这一维合并,总的复杂度是二次方而不是三次
dp[i][j] = Math.max(dp[i][j-1], prices[j]+localMax);
localMax = Math.max(localMax, dp[i-1][j]-prices[j]);
}
}
return dp[k][prices.length-1];
}
}
......@@ -9,7 +9,7 @@ package code;
* sell[i] = max( sell[i-1], buy[i-1]+price[i] )
* 空间压缩以后时间是O(n),空间是O(1)
* Tips:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/discuss/75931/Easiest-JAVA-solution-with-explanations
* lc122
* lc121, lc309, lc188, lc123, lc714
*/
public class lc309 {
public int maxProfit(int[] prices) {
......
package code;
/*
* 714. Best Time to Buy and Sell Stock with Transaction Fee
* 题意:买卖股票,不限次数,但有交易费用,求最大利润
* 难度:Medium
* 分类:Array, Dynamic Programming, Greedy
* 思路:和309思路一致,每次卖出的时候减去交易费用
* buy[i] = max( buy[i-1], sell[i-1]-price[i] )
* sell[i] = max( sell[i-1], buy[i-1]+price[i]-2 )
* Tips:
* 总结一下买卖股票的问题 交易1次,2次,任意多次都可在O(N)完成交易
* 交易k次时,时间复杂度为O(NM),M为交易次数
* 冷却时间和交易费用的解法一致,都是分买和卖两个状态,进行dp
*/
public class lc714 {
public int maxProfit(int[] prices, int fee) {
if(prices.length==0) return 0;
int b1 = -prices[0];
int s1=0, b = 0, s = 0;
for (int i = 0; i < prices.length ; i++) {
b = Math.max(b1, s1-prices[i]);
s = Math.max(s1, b1+prices[i]-fee);
s1 = s;
b1 = b;
}
return Math.max(s,b);
}
}
......@@ -45,7 +45,9 @@ LeetCode 指南
| 021 [Java](./code/lc21.java)
| 022 [Java](./code/lc22.java)
| 023 [Java](./code/lc23.java)
| 024 [Java](./code/lc24.java)
| 026 [Java](./code/lc26.java)
| 027 [Java](./code/lc27.java)
| 028 [Java](./code/lc28.java)
| 029 [Java](./code/lc29.java)
| 031 [Java](./code/lc31.java)
......@@ -96,6 +98,7 @@ LeetCode 指南
| 114 [Java](./code/lc114.java)
| 116 [Java](./code/lc116.java)
| 118 [Java](./code/lc118.java)
| 120 [Java](./code/lc120.java)
| 121 [Java](./code/lc121.java)
| 122 [Java](./code/lc122.java)
| 124 [Java](./code/lc124.java)
......@@ -138,6 +141,7 @@ LeetCode 指南
| 208 [Java](./code/lc208.java)
| 210 [Java](./code/lc210.java)
| 212 [Java](./code/lc212.java)
| 213 [Java](./code/lc213.java)
| 215 [Java](./code/lc215.java)
| 217 [Java](./code/lc217.java)
| 218 [Java](./code/lc215.java)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册