leetcode之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 dayi.

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).

意思就是:

给定一个整型数组,最多交易两次,求得最大利润。

思路:

设索引i,将数组一分为二,前半段为第一次最大利润,后半段为第二次最大利润。当然,有极端情况——即只交易一次,这种情况可以被两次的交易中包含,当i=0或i=length-1时。前半段的计算方法同Best Time to Buy and Sell Stock II的算法一样,即为profit_left[i] = (prices[i] - min > profit_left[i-1]?prices[i] - min:profit_left[i-1]);后半段的计算方法也类似,即为profit_right[j] = (max - prices[j] > profit_right[j+1]?max-prices[j]:profit_right[j+1]);。

代码如下:

class Solution {
public:
		int maxProfit(vector<int> &prices){
			vector<int>::size_type length = prices.size();
			if(length == 0){
				return 0;
			}
			int i, j, profit = 0;
			int min = prices[0], max = prices[length - 1];
			vector<int> profit_l,profit_r;
			profit_l.resize(length);
			profit_r.resize(length);
			for(i=1;i<length;i++){
				profit_l[i] = (prices[i] - min > profit_l[i-1]?prices[i] - min:profit_l[i-1]);
				min = (prices[i]>min?min:prices[i]);
			}
			for(j=length-2;j>=0;j--){
				profit_r[j] = (max - prices[j] > profit_r[j+1]?max-prices[j]:profit_r[j+1]);
				max = (prices[j]>max?prices[j]:max);
			}
			for(i=0;i<length;i++){
				profit = (profit_l[i]+profit_r[i]>profit?profit_l[i]+profit_r[i]:profit);
			}
			return profit;
		}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值