求一个数组中满足一定条件的两个元素的最大差值

之前在电面的时候碰到一道题,要求找出一个互异数组中两个元素的最大差值。具体描述如下:

有一个整数数组d[0,…,n-1],并且数组满足不存在相同的元素,要求找出

1) max{d[i] – d[j]}  i > j;(对应实际生活中的股票买卖,找出可能的最大收益)

2) max{d[i] – d[j]}  i < j;

思路有很多种,用动态规划最简单,时间复杂度都是O(n),线性时间复杂度。

针对1)动规的模型如下:

1)设n>i>2,a(i)是以d[i]价格卖出的最大收益,那么最大收益就是d[i]的值减去d[0~i-1]中最小值,即最大收益

2)那么a(i+1)则是以d[i+1]价格卖出的最大收益,就是d[i+1]的值减去d[0~i]中最小值,而1)中已经求出了d[0~i-1]的最小值,只要把那个值与d[i]的值比较即可。

3)在所有可能的卖出点求出所有最大的收益,即为所求。

int findMaxDiff1(int n, int* d)
{
    int i = 0;
    int min = d[0];
    if(n < 2) return 0;
    int maxDiff = d[1] - d[0];
    for(i = 2; i < n; i++)
    {
        if(d[i - 1] < min)
        {
            min = d[i - 1];
        }
        if(d[i] - min > maxDiff)
        {
            maxDiff = d[i] - min;
        }
    }
    return maxDiff;
}  
int findMaxDiff2(int n, int* d)
{
    int i = 0;
    int max = d[0];
    int maxDiff = d[0] - d[1];
    if(n < 2) return 0;
    for(i = 2; i < n; i++)
    {
        if(d[i - 1] > max)
        {
            max = d[i - 1];
        }
        if(max - d[i] > maxDiff)
        {
            maxDiff = max - d[i];
        }
    }
    return maxDiff;
} 

点赞