代码改变世界

已知股价序列,计算在什么时候买和卖获益最大

2015-03-05 10:27  李涛的技术博客  阅读(251)  评论(0编辑  收藏  举报

问题:一个股价序列,已知每个时间点的股价,问什么时候买和卖获利最大?时间复杂度O(n)。

假设股价按照时间点顺序放在了一个数组里,假设股价有升有降,就是说股价序列不是递减的。需要记录买入点和卖出点(用数组下标代替)。

(1)获利最大值初始化为INT_MIN。买入股价和买入点初始化为数组的第一个元素。

(2)从第二个元素开始遍历数组,如果当前股价比买入股价高,则求获利值。如果比当前获利最大值大,则修改获利最大值和卖出点。

(3)如果当前股价小于等于买入股价,则把买入股价和买入点置为当前点。

代码如下:

int bestBenifit(int arr[], int n, int& buy, int& sell)
{
    assert(arr != NULL && n > 1);
    
    buy = 0;
    sell = 0;
    int max = INT_MIN;
    int buy_p = arr[0];

    for (int i = 1; i < n; i++)
    {
        if (arr[i] > buy_p)
        {
            if (max < arr[i] - buy_p)
            {
                max = arr[i] - buy_p;
                sell = i;
            }
        }
        else
        {
            buy_p = arr[i];
            buy = i;
        }
    }
    return max;
}

如果考虑股价是递减的情况,对于遍历的任何数,都要计算当前股价和买入价的价值,并和max比较。