714. Best Time to Buy and Sell Stock with Transaction Fee。

Your are given an array of integers prices, for which the i-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.

https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/description/


给定一个数组,数组中的第i个元素代表第i天的股票价格,我们可以通过购买股票和出售股票来赚取利润,而且最多只能持有一只股票,那么也就是说每次购买股票之前必须要先将手中的出售。而且在本题中每次出售股票需要付出额外的费用,需要在这种情况下求出最大的利润。


这个题厉害了,通过这个题知道了算法中的动态规划这个思路(还是需要系统的学一下)。我们用现金来记录我们赚到的利润,同时我们需要记录手中的股票价格,然后每次需要计算当前的现金和如果出售股票所带来了的利润,如果这个利润比当前的现金多的话,就售出。同时每次也需要手中的股票价格和再次购买股票之后剩下的钱,如果购买完股票之后手中的钱还没有当前的股票价值多,就不需要变化了。

举个例子:[1,3,7,5,10,3],手续费为3。

刚开始假设我们手中的现金cash为0,并且手中持股hold为-1,这个-1就是第0天的价格,我们假设购买了这个股票,因为最初在第0天我们手中并没有现金,所以这个股票的价值就是负的,就像借别人的钱买的一样,在刚开始是负的。

然后从第1天开始,当前的股票价格为3,如果出售的话此时利润为:3+-1-3=-1,利润比手中的现金还少,所以不需要变化,此时cash=0,hold=-1。

第2天,当前的股票价格为7,出售的话利润为:7-1-3=3,利润比手中的现金多,所以就进行出售,此时cash=3,但是如果出售完成之后我们购买第2天的股票,此时如果用手中的现金去买的话,还会剩下3-7=-4,购买完之后剩下的现金还不如当前的持有的股票(-1)值钱,所以就不够买,手中的股票还是-1。那么这个cash就是假设出售的价格,以后或许会发生变化。此时cash=3,hold=-1。

第3天,股票价格为5,出售的话利润为:5-1-3=1,利润比手中的现金少,所以cash保持不变,而且3-5=-2,小于手中股票的价值,所以cash=3,hold=-1。

第4天,股票价格为10,出售的话利润为:10-1-3=6,利润比手中的现金多,所以cash更新为6,hold依旧不变。

第5天,同理保持不变,所以最终得到的利润为6。

在这个过程中,手中现金和持有股票都会不断的变化,手中的现金是在假设此时出售股票时所带来的利润。如果以后的利润会更大,那么就更新这个数值,最终求出一个最大利润。

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        int cash = 0;// 用来统计当前的利润现金
        int hold = -prices[0];// 用来计算当前的股票
        for(int i=1; i<prices.size(); i++) {
            cash = max(cash, prices[i] + hold - fee);// 比较当前现金和如果出售手头股票赚到的利润
            hold = max(hold,cash - prices[i]);// 比较当前的股票和如果购买股票之后手上剩下的钱
        }
        return cash;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值