跟我堅持刷leetcode(第五天-進階版最大股票利潤)

weixin_34321977發表於2017-04-06

對抗惰性,從今天做起。堅持每天刷leetcode並附帶一個題的題目,思路,程式碼。感興趣的小夥伴一起堅持來吧(c程式碼,不過思路都是差不多的)。


題目(難度困難):
給出一個陣列,第i個元素代表第i天的股票價格。假設你最多隻能買賣兩次股票(買一次,賣一次。再買,再賣。不能連著買兩次,再連著賣兩次。當然也可以只買賣一次),請求出你最多能賺到多少錢。
Input:[1,6,4,3,10,6,7]
Output:12
思路:
接著昨天的簡單版股票利潤,我先想到的是怎麼在原有的基礎改進。如果能儲存一下資料記錄對於某一天來說之前能賺多少錢,那麼加上上一題求出來的後面的最大值,就得到了以這一天為分割,左右兩側max的和。再比較一下這些和,求出最大值返回就行了。現在的問題就是如何求出左側max(程式碼裡是max1)的值,max的值有兩種情況,一種是分割點價值減去左側出現過的最小价值,另一種是直接等於上一天的max值。比較出最大值就是左側max值
程式碼:

int maxProfit(int* prices, int pricesSize) {
    int min = prices[0];
    int i = 1;
    int temp = 0;
    int max = 0;
    int max2 = 0;                              //用來儲存有右面的最大值
    int* max1 = malloc(sizeof(int)*pricesSize);//用來儲存左面的最大值
    max1[0] = 0;
    //下面的while記錄了以任何一天為分割點,左側利潤最大值。
    while(i<pricesSize)
    {
        max1[i] = prices[i]-min;
        if(max1[i]<max1[i-1])
        max1[i] = max1[i-1];
        if(prices[i]<min)
        min = prices[i];
        i++;
    }  
    //下面的for按分割點迴圈,並跟蹤右側最大值,順便求出總的最大值
    for(i=pricesSize-2;i>=0;i--)
    {
        temp = prices[i+1]-prices[i]+temp;
        if(temp<0)
        temp = 0;
        if(temp>max2)
        max2 = temp;
        if((max1[i]+max2)>max)
        max = max1[i]+max2;
    }
    if(max1[pricesSize-1]>max)
    return max1[pricesSize-1];
    else
    return max;
}

相關文章