714. Best Time to Buy and Sell Stock with Transaction Fee(python+cpp)

题目:

our are given an array of integers prices, for which thei-th element is the price of a given stock on day i; and a non-negative integer fee representing a transaction fee.
You may complete as many transactions as you like, but you need to pay the transaction fee for each transaction. You may not buy more than 1 share of a stock at a time (ie. you must sell the stock share before you buy again.
Return the maximum profit you can make
Example 1:

Input: prices = [1, 3, 2, 8, 4, 9], fee = 2 
Output: 8
Explanation: The maximum profit can be achieved by: Buying at prices[0] = 1
 Selling at prices[3] = 8 Buying at prices[4] = 4 Selling at prices[5] = 9 
 The total profit is ((8 - 1) - 2) + ((9 - 4) - 2) =8.

Note:
0 < prices.length <= 50000.
0 < prices[i] < 50000.
0 <= fee < 50000.

解释:
每次卖出的时候需要付出小费。同样一天可以同时卖出和买入,但是一定要线卖出再买入。
动态规划:
对于第i天的收益,可能有两种情况:手中有stock和手中没有stock
如果手中没有stock,可能是今天刚卖出或者是保持前一天的状态 ,此时令收益为cash
如果手中stock,可能是今天刚买入或者是保持前一天的状态,此时令收益为hold(收益有可能是负的)。
因为i天的状态仅和前一天的状态有关,所以只需要两个变量cashhold(当然也可以用两个数组实现),
cash 表示手上没有stock状态下的收益,hold表示手上有stock状态下的收益。
这里需要注意cashhold的初始值,最终输出cash,因为最后一天的情况一定是手里没有stock的。
可是为什么每天都保持max()??是因为最终要求最大利润吗?

python代码:

class Solution:
    def maxProfit(self, prices, fee):
        """
        :type prices: List[int]
        :type fee: int
        :rtype: int
        """
        hold=-prices[0]
        cash=0
        for i in range(len(prices)):
           """
            手中没有stock,今天卖出(先前有的状态+今天的价格-小费)
            或者保持昨天没有的状态
            """
            cash=max(cash,hold+prices[i]-fee)
            """
            手中有stock,今天买入(可能是今天先卖了再买入,也可能进入今天的
            时候手上就没有stock,直接买入)(先前没有的状态-今天的价格)或者
            保持昨天有的状态
            """
            hold=max(hold,cash-prices[i])
        return cash

c++代码:

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        int hold=-prices[0];
        int cash=0;
        for (int i=0;i<prices.size();i++)
        {
            cash=max(cash,hold+prices[i]-fee);
            hold=max(hold,cash-prices[i]);
        }
        return cash;
    }
};

改成两个数组做,或许更好理解:

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        int n = prices.size() ; 
        if( n <= 1 )
            return 0 ;
        vector<int> buy(n,0);
        vector<int> sell(n,0);
        buy[0] = - prices[0];
        for( int i= 1 ; i<prices.size() ; i++){
            sell[i] = max( buy[i-1] + prices[i] - fee , sell[i-1] ) ;
            buy[i] = max( sell[i] - prices[i] , buy[i-1] ) ;
        }
        return sell[n-1];
    }
};

总结:
买股票系列的题目都停迷醉的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值