leetcode123---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.
给你一个数组,里边的第i个元素存储的是股票在第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).
不能同时进行多次交易(在你再一次买进之前必须先卖出)。

问题求解:

动态规划法,时间复杂度O(n)。进行两次交易,分别从前往后遍历和从后往前遍历
数组p1[i]记录了price[0..i]的最大收益
数组p2[i]记录了price[i..n]的最大收益
已知p1[i-1],可以求p1[i];已知p2[i+1],可以求p2[i]。
最后,我们再用O(n)的时间找出max(p1[i]+p2[i])即可。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        if(n <= 1){
            return 0;
        }
        //[0,...,i]区域内买进卖出最大收益
        vector<int> p1(n);//定义向量对象p1,包含了n个值为0的元素
        //[i,...,n-1]区域内买进卖出最大收益
        vector<int> p2(n);
        int minimum = prices[0];
        for(int i=1;i<n;i++){//[0,...,i]区域,从前往后遍历
            //更新最低价格
            minimum = prices[i]<minimum?prices[i]:minimum;
            //动态规划
            p1[i] = max(p1[i-1], prices[i]-minimum);
        }
        int maximum = prices[n-1];
        for(int i=n-2;i>=0;i--){//[i,...,n-1]区域,从后往前遍历
            //更新最高价格
            maximum = prices[i]>maximum?prices[i]:maximum;
            //动态规划
            p2[i] = max(p2[i+1], maximum-prices[i]);
        }
        int max_profit = 0;
        int profit = 0;
        for(int i=0;i<n;i++){
            profit = p1[i] + p2[i];
            max_profit = profit>max_profit?profit:max_profit;
        }
        return max_profit;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值