LeetCode: Best Time to Buy and Sell Stock III

思路:因为可以进行两次交易,而且每次交易不一定是在同一个单调区间内(不同于多次交易,如II )。

假设选择交易的分界点是 i 点(注意i点可以同时卖出、买进一次),只要知道i点左端的最大利率和右段的交易一次的最大利率,然后相加就是整个区间进行两次交易的最大利率,求解左右端利率的方法就是很基本的DP求解过程。

code:

class Solution {
public:
    int maxProfit(vector<int> &prices) {
        int len = prices.size();
        if(len == 0)return 0;
        int leftProfit[len], rightProfit[len];
        memset(leftProfit,0,sizeof(int) * len);
        memset(rightProfit,0,sizeof(int) * len);
        int min_v = prices[0];
        for(int i = 1;i <len;i++){
            if(prices[i] < min_v)
                min_v = prices[i];
            leftProfit[i] = leftProfit[i-1] > (prices[i] - min_v) ? leftProfit[i-1] : (prices[i] - min_v);
        }
        int max_v = prices[len-1];
        for(int i = len-2;i >= 0;i--){
            if(prices[i] > max_v)
                max_v = prices[i];
            rightProfit[i] = rightProfit[i+1] > (max_v - prices[i]) ? rightProfit[i+1] : (max_v - prices[i]);
        }
        int maxProfit = 0;
        for(int i = 0;i < len;i++)
            maxProfit = std::max(maxProfit,rightProfit[i] + leftProfit[i]);
        return maxProfit;
    }
};


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值