【風口之下,豬都能飛】(一道算法面試題) (待續)

題目:算法

風口之下,豬都能飛。當今中國股市牛市,真可謂「錯過等七年」。 給你一個回顧歷史的機會,已知一支股票連續n天的價格走勢,以長度爲n的整數數組表示,數組中第i個元素(prices[i])表明該股票第i天的股價。 假設你一開始沒有股票,但有至多兩次買入1股然後賣出1股的機會,而且買入前必定要先保證手上沒有股票。若兩次交易機會都放棄,收益爲0。 設計算法,計算你能得到的最大收益。 輸入數值範圍:2 <= n <= 100, 0 <= prices[i] <= 100數組

輸入例子:ide

3, 8, 5, 1, 7, 8設計


解析:blog

這道題須要注意的地方在於,「買入前必定要保證手上沒有股票」。rem

所以咱們能夠假設在數組的第一天買入(第一次買入),get

次日賣出(第一次賣出)it

同時次日買入(第二次買入)io

第三天賣出(第二次賣出)for循環

以下圖:

wKioL1cLwrWx-JK2AAAbeSb276U110.png

能夠經過4個for循環不斷令這4個日期偏移,得出全部可能的買賣天數及對應的收益,並取最大值並返回它。

用代碼實現以下:

int calculateMax(vector<int> &prices)
{
	int sz = prices.size();
	int remain_value1 = 0;
	int remain_value2 = 0;
	int ret = 0;

	if (sz == 2)
	{
		if (prices[1] - prices[0] > 0)
		{
			return prices[1] - prices[0];
		}
		else
		{
			return 0;
		}
	}
	int buy1_pos = 0;
	int sell1_pos = 1;
	int buy2_pos = sell1_pos;
	int sell2_pos = buy2_pos + 1;

	int buy1_prices = prices[buy1_pos];
	int buy2_prices = prices[buy2_pos];
	int sell1_prices = prices[sell1_pos];
	int sell2_prices = prices[sell2_pos];


	for (buy1_pos = 0; buy1_pos < sz - 1; buy1_pos++)
	{
		buy1_prices = prices[buy1_pos];
		for (sell1_pos = buy1_pos + 1; sell1_pos < sz; sell1_pos++)
		{
			sell1_prices = prices[sell1_pos];
			for (buy2_pos = sell1_pos; buy2_pos < sz - 1; buy2_pos++)
			{
				buy2_prices = prices[buy2_pos];
				for (sell2_pos = buy2_pos + 1; sell2_pos < sz; sell2_pos++)
				{
					sell2_prices = prices[sell2_pos];
					if (remain_value1 < sell1_prices - buy1_prices)
					{
						remain_value1 = sell1_prices - buy1_prices;
					}
					if (remain_value2 < sell2_prices - buy2_prices)
					{
						remain_value2 = sell2_prices - buy2_prices;
					}
					if (ret < remain_value1 + remain_value2)
					{
						ret = remain_value1 + remain_value2;
					}
				}
				remain_value1 = 0;
				remain_value2 = 0;
			}
		}
	}
	return ret;
}

這種方法簡單粗暴,思路簡單,但效率並不高,能夠看出時間複雜度是O(N^4).

相關文章
相關標籤/搜索