Say you have an array for which the ith element is the price of a given stock on day i.
If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit.
eg:输入为:[6,4,3,7,3,8,1,4,7,6],则最大收益为7-1=6。
思路一:
先找到数组中的最大数8,在第5天以8卖出时,必须在第0-5天买入,且买入时的价格要为第0-5天的最低价3,此时的收益为8-3=5;如果第0-5天的最低价3并不是整个数组的最低价,
再考虑在第5天之后进行买卖交易,找到第6-9天的最高价7(第8天卖出),第6-8天的最低价1(第6天买入),此时的收益为7-1=6;若要在第8天之后进行买卖交易,则收益为0。所以
最大收益为max(5,6,0),即最大收益为6。
1 class Solution { 2 public: 3 int maxProfit(vector<int> &prices) { 4 int max_profit=0, buy_pos, sell_pos; 5 vector<int>::iterator it1=prices.begin(); 6 vector<int>::iterator it2=prices.end(); 7 while(it1<it2) 8 { 9 vector<int>::iterator sell_it = max_element(it1, it2); 10 vector<int>::iterator buy_it = min_element(it1, sell_it+1); 11 if(max_profit<(*sell_it-*buy_it)) 12 max_profit = *sell_it-*buy_it; 13 it1 = sell_it+1; 14 } 15 return max_profit; 16 } 17 };
但是这种方法复杂度高,会出现Time limit exceed。
思路二:
eg:输入为:[6,4,3,7,3,8,1,4,7,6]
分别考虑如果在第0天,第1天,第2天,...,第9天卖出股票时的收益,这9种情况下的收益最大值就是我们要求的最大收益。
要在第i天卖出股票,则必须在第0~i天中的某一天买入,当然选取第0~i天内价格最小的一天买入,记这个最小值为buyPrice_i,则第i天卖出股票时的收益为prices[i]-buyPrice_i;
在求buyPrice_i时可以动态地求,不需要每次从头到i遍历一遍。最后我们要求的maxprofit=max(prices[0]-buyPrice_0, prices[1]-buyPrice_1, ... , prices[9]-buyPrice_9)。
1 class Solution { 2 public: 3 int maxProfit(vector<int> &prices) { 4 if(prices.size()==0) 5 return 0; 6 int max_profit=0, sell_pos; 7 int min_buy_price=prices[0]; 8 for(sell_pos=0; sell_pos<prices.size(); sell_pos++) //在sell_pos卖出的话,必须在0-sell_pos之间买入,所以sell_pos当天卖出时的最大收益要求buy_pos在0-sell_pos之间最小 9 { 10 if(min_buy_price>prices[sell_pos]) 11 min_buy_price = prices[sell_pos]; 12 if(max_profit<(prices[sell_pos]-min_buy_price)) 13 max_profit = prices[sell_pos]-min_buy_price; 14 } 15 return max_profit; 16 } 17 };
这种思路可以accept。