題目:算法
風口之下,豬都能飛。當今中國股市牛市,真可謂「錯過等七年」。 給你一個回顧歷史的機會,已知一支股票連續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循環
以下圖:
能夠經過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).