給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。
設計一個算法來計算你所能獲取的最大利潤。你能夠儘量地完成更多的交易(屢次買賣一支股票)。
注意:你不能同時參與多筆交易(你必須在再次購買前出售掉以前的股票)。ios
1.3 樣例算法
輸入: [7,1,5,3,6,4]
輸出: 7
解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能得到利潤 = 5-1 = 4 。
隨後,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能得到利潤 = 6-3 = 3 。數組
輸入: [1,2,3,4,5]
輸出: 4
解釋: 在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能得到利潤 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接連購買股票,以後再將它們賣出。
由於這樣屬於同時參與了多筆交易,你必須在再次購買前出售掉以前的股票。spa
輸入: [7,6,4,3,1]
輸出: 0
解釋: 在這種狀況下, 沒有交易完成, 因此最大利潤爲 0。設計
把全部可能獲利的交易都吃掉,局部最優能夠得到全局最優。
算差分數組,把差分數組中全部爲正的元素都加起來就是最大收益。blog
好比輸入: [7,1,5,3,6,4]
差分數組爲:[0,-6,4,-2,3,-2]
最大收益爲 4 + 3 = 7ci
代碼:io
原理:由於咱們求的只是最大的收益,而不須要咱們記錄何時買何時賣,此時咱們須要作的是比較相鄰兩天的股票價格,若是是漲就繼續持有(若是還未購入就購入),若是是跌就在跌的前一天拋出(若是還未購入就不要購入),此時用到的就是差分數組,把正數相加。class
/**/ #include<iostream> #include<vector> using namespace std; int main() { vector<int> price; int temp; int sum=0; while(cin>>temp) { price.push_back(temp); } for(int i=0;i<price.size();i++) { if(price[i+1]>price[i]) { sum+=price[i+1]-price[i]; } } cout<<sum<<endl; return 0; }
分析:時間複雜度:O(n),空間複雜度O(1) stream
拓展:此題還能夠變爲賣買股票的最佳時機,這時就須要咱們申請一個數組來存放賣買股票的時間