Best Time to Buy and Sell Stock III 两次买卖股票的最佳时机 (重重重)

题目:

只能买卖两次,而且最大手里只有一只股票。求最大利润。

解答:

参考:

http://www.cnblogs.com/lihaozy/archive/2012/12/19/2825525.html

http://haoplusplus.com/2014/02/18/leetcode-best-time-to-buy-and-sell-stock-i-ii-and-iii/

http://blog.unieagle.net/2012/12/05/leetcode%E9%A2%98%E7%9B%AE%EF%BC%9Abest-time-to-buy-and-sell-stock-iii%EF%BC%8C%E4%B8%80%E7%BB%B4%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/

代码:

  /*
  解释:
  首先,因为能买2次(第一次的卖可以和第二次的买在同一时间),但第二次的买不能在第一次的卖左边。
  所以维护2个表,f1和f2,size都和prices一样大。
  意义:
  f1[i]表示 -- 截止到i下标为止,左边所做交易能够达到最大profit;
  f2[i]表示 -- 截止到i下标为止,右边所做交易能够达到最大profit;
  那么,对于f1 + f2,寻求最大即可。
  */
  class Solution {
  public:
	  int maxProfit(vector<int> &prices) {
		  int size = prices.size();
		  if (size == 0)
			  return 0;
		  vector<int> f1(size);
		  vector<int> f2(size);
		  int minV = prices[0];
		  f1[0] = 0;
		  for (int i = 1; i < size; i++)
		  {
			  minV = min(minV, prices[i]);
			  f1[i] = max(f1[i - 1], prices[i] - minV);
		  }
		  int maxV = prices[size - 1];
		  f2[size - 1] = 0;
		  for (int i = size - 2; i >= 0; i--)
		  {
			  maxV = max(maxV, prices[i]);
			  f2[i] = max(f2[i + 1], maxV - prices[i]);
		  }
		  int sum = 0;
		  for (int i = 0; i < size; i++)
		  {
			  sum = max(sum, f1[i] + f2[i]);
		  }
		  return sum;
	  }
  };


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值