LeetCode714 买卖股票最佳时机含手续
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。
你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。
返回获得利润的最大值。
注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。
示例 1:
输入: prices = [1, 3, 2, 8, 4, 9], fee = 2
输出: 8
解释: 能够达到的最大利润:
在此处买入 prices[0] = 1
在此处卖出 prices[3] = 8
在此处买入 prices[4] = 4
在此处卖出 prices[5] = 9
总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8.
思路:
采用动态规划算法(dp)
假设第N天,如果是卖出则利润为sale,如果是买入则利润为buy;
则,
第1天
sale=0, buy=0-prices[0];
第2天
sale=std::max(sale, buy + prices[i] - fee),用第一天卖出的利润
与第一天买入后今天卖出的利润
相比
buy=std::max(buy, sale - prices[i]),用第一天买入的利润
与第一天卖出后今天买入的利润
相比
第i天
...
得到某天卖出时的利润为sale,或者买入时的利润为buy;
最后比较std::max(sale, buy)得到最大利润;
但,考虑实际情况肯定是全部卖出利润最高,可以直接得到结果为 sale。
解题:
int maxProfit(vector<int>& prices, int fee) {
// if (prices.size() > 5000 || 0 > fee || 50000 <= fee) { return -1; }
int buy = 0 - prices.at(0), sale = 0; // 第一天买或卖时利润分别
for (int i =0 ; i < prices.size(); ++i) {
int tmp_buy = buy, tmp_sale = sale; // 前一天买或卖时最终利润
buy = std::max(buy, tmp_sale - prices[i]);
sale = std::max(sale, tmp_buy + prices[i] - fee);
}
cout << "buy:" << buy << " sale:" << sale << endl;
return sale; // 股票卖出利润肯定大于持有的利润
}