【劍指offer】面試題63:股票的最大利潤【C++版本】
題目:
股票的最大利潤
假設把某股票的價格按照時間先後順序儲存在陣列中,請問買賣該股票一次可能獲得的最大利潤是多少?例如,一隻股票在某些時間節點的價格為{9,11,8,5,7,12,16,14}。如果我們能在價格為5的時候買入並在價格為16的時候賣出,則能收穫最大的利潤11。
解題思路:
1.可以轉換成為求最大子陣列問題,陣列相鄰的數後一個減去前一個減得到股票的變化陣列{2,-3,-3,2,5,4,-2}。這樣問題轉換成了求陣列的最大子陣列問題。
2.也可以在遍歷陣列時記錄下遍歷到某個節點能夠買入的最低價格,在當前價格確定的情況下,在最低價格買入能夠賺最多。這樣遍歷一次陣列就能得到結果,時間複雜度為O(n)。
【C++版本】
#include <iostream>
#include <vector>
using namespace std;
int main() {
system("pause");
return 0;
}
//
int MaxDiff(const int *numbers, unsigned length) {
if (numbers == NULL || length < 2)return 0;
int min = numbers[0];
int resu = numbers[1] - min;
for (int i = 2; i != length; i++) {
//檢查前一天的值是不是最小值,是就更新最小值
if (numbers[i-1] < min) {
min = numbers[i-1];
}
//當前時間賣出能賺到最多的錢嗎
if ((numbers[i] - min) > resu) {
resu = numbers[i] - min;
}
}
return resu;
}