From 47817b2e9fbb7cbe1d2240c3815a9953d9eb994a Mon Sep 17 00:00:00 2001 From: liu13 <1099976891@qq.com> Date: Wed, 13 Mar 2019 11:00:44 +0800 Subject: [PATCH] 20190313 --- code/lc121.java | 13 +++++-------- code/lc122.java | 2 +- code/lc123.java | 41 +++++++++++++++++++++++++++++++++++++++++ code/lc188.java | 37 +++++++++++++++++++++++++++++++++++++ code/lc309.java | 2 +- code/lc714.java | 28 ++++++++++++++++++++++++++++ readme.md | 4 ++++ 7 files changed, 117 insertions(+), 10 deletions(-) create mode 100644 code/lc123.java create mode 100644 code/lc188.java create mode 100644 code/lc714.java diff --git a/code/lc121.java b/code/lc121.java index 5c351de..e738099 100644 --- a/code/lc121.java +++ b/code/lc121.java @@ -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]= 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]; + } +} diff --git a/code/lc309.java b/code/lc309.java index afffdd1..907ddda 100644 --- a/code/lc309.java +++ b/code/lc309.java @@ -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) { diff --git a/code/lc714.java b/code/lc714.java new file mode 100644 index 0000000..6a0b90e --- /dev/null +++ b/code/lc714.java @@ -0,0 +1,28 @@ +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); + } +} diff --git a/readme.md b/readme.md index 7cfbbf0..f01c460 100644 --- a/readme.md +++ b/readme.md @@ -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) -- GitLab