面试题63:股票的最大利润

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;
}
posted @ 2020-08-30 10:19  程序员曾奈斯  阅读(291)  评论(0编辑  收藏  举报