1 题目描述
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?例如,一只股票在某些时间节点的价格为{9,11,8,5,7,12,16,14}。如果我们在价格为5的时候买入,在价格为16的时候卖出,则能收获最大的利润11。
2 输入
数组,代表股票一段时间的价格
3 输出
最大利润
4 样例输入
{9,11,8,5,7,12,16,14}
5 样例输出
11
6 求解思路
动态规划,设置(diff(i))代表当卖出价格为第i个数字的时候能获得的最大利润,则(diff(i)=num[i]-min),其中min表示前(i-1)个数字中最小的值。
7 C++版本代码如下
int maxDiff(int numbers[], int length){
if(length < 2)
return 0;
vector<int> diff(length, -1);
int min = numbers[0];
diff[1] = numbers[1] - min;
for(int i = 2; i < length; i++){
if(numbers[i- 1] < min)
min = numbers[i- 1];
diff[i] = numbers[i] - min;
}
int maxFee = -999;
for(int i = 1; i < length; i++)
if(diff[i] > maxFee)
maxFee = diff[i];
return maxFee;
}
更加精简的版本:
int maxDiffPlus(int numbers[], int length){
if(length < 2)
return 0;
int min = numbers[0];
int maxDiff = numbers[1] - min;
for(int i = 2; i < length; i++){
if(numbers[i - 1] < min)
min = numbers[i - 1];
int currentDiff = numbers[i] - min;
if(currentDiff > maxDiff)
maxDiff = currentDiff;
}
return maxDiff;
}