LeetCode 123. Best Time to Buy and Sell Stock III

LeetCode 123. Best Time to Buy and Sell Stock III

题目:

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete at most two transactions.

Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before > you buy again).

分析:

方法很暴力,没有用分治,耗时很长。仅为提供另外一种思路。

pic_1

这里构建了上图的模型,很显然,我们要使money[0]+money[1]最大化,当loss_now朝向向下时,loss_now归入loss[1],朝向向上时,我们要想取得最大化利润得考虑以下几个操作:

  • 无操作

  • money[1]代替loss_now

  • money[0]代替money[1],money[1]代替loss_now

  • money[0]与money[1]合并,money[1]代替loss_now

  • money_[1]与loss_now合并

至于采用哪个操作就看哪个操作带来的利润更大。

具体代码如下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if (!prices.size())return 0;
        vector<int> money(2, 0);
        vector<int> loss(2, 0);
        int loss_last = 0;
        for (int index = 1; index < prices.size(); index++)
        {
            int loss_now = prices[index] - prices[index - 1] + loss_last;
            if (loss_now < 0)
            {
                loss_last = 0;
                if (money[1] != 0)loss[1] -= loss_now;
                else if (money[0] != 0)loss[0] -= loss_now;
            }
            else if (loss_now > 0)
            {
                if (money[1] != 0)
                {
                    int max_value = max((money[0]+money[1]),(money[1]+loss_now));
                    max_value = max(max_value, (money[0] + loss_now));
                    max_value = max(max_value, (money[0] + money[1] + loss_now - loss[0]));
                    max_value = max(max_value, (money[0] + money[1] + loss_now - loss[1]));
                    cout<<max_value<<endl;
                    if (max_value == (money[0] + money[1]))
                    {
                        loss_last = loss_now;
                        cout<<"!"<<loss_last<<endl;
                        continue;
                    }
                    else if (max_value == (money[0] + loss_now))
                    {
                        loss[0] = loss[0] - money[1] + loss[1];
                        loss[1] = 0;
                        money[1] = loss_now;
                    }
                    else if (max_value == (money[1] + loss_now))
                    {
                        loss[0] = loss[1];
                        loss[1] = 0;
                        money[0] = money[1];
                        money[1] = loss_now;
                    }
                    else if (max_value == (money[0] + money[1] + loss_now - loss[0]))
                    {
                        money[0] = money[0] - loss[0] + money[1];
                        money[1] = loss_now;
                        loss[0] = loss[1];
                        loss[1] = 0;
                    }
                    else if (max_value == (money[0] + money[1] + loss_now - loss[1]))
                    {
                        money[1] = money[1] - loss[1] + loss_now;
                        loss[1] = 0;
                    }
                    loss_last = 0;
                }
                else if(money[0] != 0)
                    money[1] = loss_now;
                else 
                    money[0] = loss_now;
            }
        }
        return money[0] + money[1];
    }
};
  • -
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值