賣買股票的最佳收益

1 問題描述、輸入輸出與樣例

1.1 問題描述

給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。

設計一個算法來計算你所能獲取的最大利潤。你能夠儘量地完成更多的交易(屢次買賣一支股票)。

注意:你不能同時參與多筆交易(你必須在再次購買前出售掉以前的股票)。ios

1.2 輸入與輸出

1.3 樣例算法

1.3.1 樣例1

輸入: [7,1,5,3,6,4]

輸出: 7

解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能得到利潤 = 5-1 = 4 。
    隨後,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能得到利潤 = 6-3 = 3 。數組

1.3.2 樣例2

輸入: [1,2,3,4,5]

輸出: 4

解釋: 在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能得到利潤 = 5-1 = 4 。
    注意你不能在第 1 天和第 2 天接連購買股票,以後再將它們賣出。
    由於這樣屬於同時參與了多筆交易,你必須在再次購買前出售掉以前的股票。spa

1.3.3 樣例3

輸入: [7,6,4,3,1]

輸出: 0

解釋: 在這種狀況下, 沒有交易完成, 因此最大利潤爲 0。設計

2 思路描述與代碼

2.1 思路描述(貪心法)

把全部可能獲利的交易都吃掉,局部最優能夠得到全局最優。

算差分數組,把差分數組中全部爲正的元素都加起來就是最大收益。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

拓展:此題還能夠變爲賣買股票的最佳時機,這時就須要咱們申請一個數組來存放賣買股票的時間

相關文章
相關標籤/搜索