1. 程式人生 > >Best Time to Buy and Sell Stock III 兩次買賣股票的最佳時機 (重重重)

Best Time to Buy and Sell Stock III 兩次買賣股票的最佳時機 (重重重)

題目:

只能買賣兩次,而且最大手裡只有一隻股票。求最大利潤。

解答:

參考:

程式碼:

  /*
  解釋:
  首先,因為能買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;
	  }
  };