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

posted @ 2021-12-28 22:11  DidUStudy  阅读(24)  评论(0编辑  收藏  举报