714. 买卖股票的最佳时机含手续费
描述
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。
你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。
返回获得利润的最大值。
注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。
链接
714. 买卖股票的最佳时机含手续费 - 力扣(LeetCode) (leetcode-cn.com)
解法:贪心
做收获利润操作的时候其实有三种情况:
- 情况一:收获利润的这一天并不是收获利润区间里的最后一天(不是真正的卖出,相当于持有股票),所以后面要继续收获利润。
- 情况二:前一天是收获利润区间里的最后一天(相当于真正的卖出了),今天要重新记录最小价格了。
- 情况三:不作操作,保持原有状态(买入,卖出,不买不卖)
1 class Solution { 2 public int maxProfit(int[] prices, int fee) { 3 int res = 0; 4 int minPrice = prices[0]; // 记录最低价格 5 for (int i = 1; i < prices.length; i++){ 6 // 情况二: 相当有买入 7 if (prices[i] < minPrice) minPrice = prices[i]; 8 9 // 情况三:保持原有状态(因为此时买则不便宜,卖则亏本) 10 if(prices[i] >= minPrice && prices[i] <= minPrice + fee) continue; 11 12 // 情况一:计算利润,可能有多次计算利润,最后一次才是真正的卖出 13 if (prices[i] > minPrice + fee) { 14 res += prices[i] - minPrice - fee; 15 minPrice = prices[i] - fee; //重要,下一轮,必须有 prices[i+1] + fee < prices[i],才有必要更新 16 System.out.println("i:" + i + " res:" + res + ", " + " minPrice:" + minPrice); 17 } 18 } 19 return res; 20 } 21 }
另一种解法
1 class Solution { 2 public int maxProfit(int[] prices, int fee) { 3 int buy = prices[0] + fee; // 买入成本 4 int sum = 0; 5 for (int p : prices) { 6 if (p + fee < buy){ //有更低的购入成本,则更新buy 7 buy = p + fee; 8 } else if ( p > buy) { //当有 盈利时候 9 sum += p - buy; 10 buy = p; // 当p[i+1] + fee < p[i]时,才有下一轮更新buy的希望 11 } 12 } 13 return sum; 14 } 15 16 public int maxProfit2(int[] prices, int fee) { 17 int res = 0; 18 int minPrice = prices[0]; // 记录最低价格 19 for (int i = 1; i < prices.length; i++){ 20 // 情况二: 相当有买入 21 if (prices[i] < minPrice) minPrice = prices[i]; 22 23 // 情况三:保持原有状态(因为此时买则不便宜,卖则亏本) 24 if(prices[i] >= minPrice && prices[i] <= minPrice + fee) continue; 25 26 // 情况一:计算利润,可能有多次计算利润,最后一次才是真正的卖出 27 if (prices[i] > minPrice + fee) { 28 res += prices[i] - minPrice - fee; 29 minPrice = prices[i] - fee; //重要,下一轮,必须有 prices[i+1] + fee < prices[i],才有必要更新 30 System.out.println("i:" + i + " res:" + res + ", " + " minPrice:" + minPrice); 31 } 32 } 33 return res; 34 } 35 }
也可以用动态规划做
参考
carl