LeetCode算法问题10 —— Best Time to Buy and Sell Stock with Transaction Fee

来源:互联网 发布:meego软件下载网 编辑:程序博客网 时间:2024/05/21 07:54

问题描述
这里写图片描述

prices是这个股票每天价钱的数组,而fee,我把它理解为手续费,即一组买入卖出后要交的费用。
题目要求我们手上只能有1份股权,也就是说如果我们还想买进股票,必须先把原先自己拥有的股票抛售才行。
整个问题的描述就是这样,要求也很简洁,求出我们能获得的最大利润。可以很简单的确认一次交易的利润,假定我们在第i天买入,第j天抛售(以0为起始天),则
profit=prices[j]prices[i]fee

这个题目用了动态规划的思想。我们先讨论第一天的情况,然后讨论前两天的情况,最后讨论到最后一天的情况。

对于每天,存在两种状态:
1. 手中没有股票(利润为pro1):此时可以选择是否买入股票,且显然此时手中没有可以卖出的股票
2. 手中有股票(利润为pro2):此时可以选择是否抛售股票,当然,卖掉再买是不可能获得最大利润的(此时亏了交易价fee),因此不用考虑卖掉再买的情况

基于动态规划的思想,要保证每天中的这两种状态的已有利润都必须是最优的,也就是它保证了之前几天的操作所可以获得的最大利润,因此在更新第i天的pro1,pro2的时候要有一定的比较:

对于手中没有股票的利润pro1的更新,它的可能有两种 ——
1. 本身就是无股票的,也就是说,上一个状态就是无股票
2. 上一次状态是有股票的,只不过在这一天卖掉了
因此
pro1=max(pro1,pro2+prices[i])

而对于手中有股票的利润pro2的更新,同样也有两种可能 ——
1. 本身就是拥有股票的,且这一天没有抛售
2. 本身没有股票,改天买进了股票
因此
pro2=max(pro2,pro1prices[i]fee)
其中这里的pro1是更新之前的pro1,即第i-1天的。

这样就保证了每天的拥有股票和没有拥有股票都保持了最优利润状态。而最后一天要获取最大利润的话,肯定此时手中已经没有股票,因此最后的最大利润肯定是
pro1 > pro2

因此解决这个问题就很简单了,遍历prices,循环中实时更新pro1,pro2即可

   int maxProfit(vector<int>& prices, int fee) {        int pro1 = 0, pro2 = INT_MIN;         for(int i = 0; i < prices.size(); i++) {            int tmp = pro1;            pro1 = max(pro1, pro2 + prices[i]);            pro2 = max(pro2, tmp-prices[i]-fee);        }        return pro1;    }

只有一层循环遍历,复杂度为O(n)

阅读全文
0 0
原创粉丝点击