LeetCode122. Best Time to Buy and Sell Stock II題解

今天討論一道讓我想的過於複雜的題目:一道有關股票買賣的問題。

1. 題目描述

Say you have an array for which the i th element is the price of a given stock on day i. Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times). However, you may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
【翻譯過來】:
給一個數組,這個數組裏面第i個元素代表第i天的股票價格(肯定是一個非負數啦),需要我們設計能夠獲得最大利潤的算法。
這樣的算法:在合適的時間買賣賺取差價從而獲得利潤,可以對股票進行多次買賣,但是每一次買這支股票的時候要保證首先已經賣出去了,即:在重新購買之前必須賣掉。

2. 分析

剛開始我想的過於複雜了:認爲只能得到當天的股票價格和之前的股票價格,在此基礎之上設計獲得最大利潤的算法。我如果能設計出來,那就發大財啦!實際上,允許你知道後面的股票價格,即我們可以預先看到後面的股票價格。
於是,我選擇了使用貪心算法:我們進行數組中的兩兩比較:如果後面一天的價格高於前面的價格,就買入,然後在第二天賣出,利潤就是這兩天的差價。
翻譯過來:我們查看當前一天的價格和後一天的價格,如果當前一天低於後一天價格,我們本着【低價買入高價售出】的原則,選擇在這一天買入,然後在第二天賣出,然後繼續比較第二天的價格和第三天的價格,如果仍然出現第三天高於第二天的情況,就在第二天繼續買入,第三天賣出,利潤是一樣的。
【例子1】:
例如這個數組是:

[5,1,2,3,4]

我們檢查:
第一天價格是5,第二天價格是1,第一天價格高於第二天,賠本的生意不做,不買;
第二天價格是1,第三天價格是2,第三天價格高於第二天,可以第二天買第三天賣,賺1元;
第三天價格是2,第四天價格是3,第四天價格高於第三天,可以第三天買第四天賣,賺1元;
第四天價格是3,第五天價格是4,第五天價格高於第四天,可以第四天買第五天賣,賺1元;
於是總利潤是:1+1+1 = 3
這樣與第二天買,第五天賣,利潤:4-1 = 3相同
這裏寫圖片描述
【例子2】:
例如這個數組是:

[5,1,2,3,1]

我們檢查:
第一天價格是5,第二天價格是1,第二天價格低於第一天,賠本的生意不做,不買;
第二天價格是1,第三天價格是2,第三天價格高於第二天,可以第二天買第三天賣,賺1元;
第三天價格是2,第四天價格是3,第四天價格高於第三天,可以第三天買第四天賣,賺1元;
第四天價格是3,第五天價格是1,第五天價格低於第四天,賠本的生意不做,不買;
於是總利潤是:1+1 = 2
這裏寫圖片描述
【總結】:
我們的貪心算法保證:目前獲得的利潤最大:買股票的價格一定要小於等於下一天的價格,這樣才保證不會虧錢,每一步的利潤就是第二天高價售出和頭一天低價買入之間的差值。
這裏寫圖片描述

3. 源碼

#include <iostream>
#include <vector>
using namespace std;
int maxProfit(vector<int>& prices);
int main() {
    vector<int> prices;
    prices.push_back(5);
    prices.push_back(1);
    prices.push_back(2);
    prices.push_back(3);
    prices.push_back(1);
    int result = maxProfit(prices);
    cout << "Total profit: " << result << endl;
    return 0;
}
int maxProfit(vector<int>& prices) {
    int maxProfit = 0;
    for (int i = 0; i < (int)prices.size()-1; i++) {
        if (prices[i+1] - prices[i] >= 0) {
            cout << "Buy on day " << i+1 << endl;
            cout << "Sell on day " << i+2 << endl;
            maxProfit += prices[i+1] - prices[i];
            cout << "current profit: " << prices[i+1] - prices[i] << endl;
        }
    }
    return maxProfit;
}

4. 心得

完全理解題目後就很容易了,使用貪心算法即可。貪心算法的應用在這裏的策略總結起來就是:步步爲營,穩紮穩打,每一步驟都力求當前利潤最大化即可,並沒有從整個全局來看。
但是話說回來,在現實生活中應該沒有人預先知道第二天的股票價格,知道的話那就穩賺不賠啦。不過這倒是給了我們投資的一個建議:見好就收,來日方長。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章