求一个数组中两个元素的最大差值

一个整数数组a[n],在a[n]中找两个数字,使得下标大的数字减去下表小的数字所得的差值最大,即:
在a[n]中找 a[i] 和 a[j] ,使得 a[i] - a[j] 的值最大,并且 i > j 。 题目来自这里

寻求O(n)的解法,思路:

记录已经遍历的元素中的最小值min和当前所求的最大差值r,然后继续遍历下一个元素。

首先和当前最小值min求差,如果比r大,则更新r

其次,跟当前最小值min比较,如果小于min,则更新min

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a[]={-1, -2, -3, -1};
    int n = sizeof(a) / sizeof(a[0]);
    int min, r;  // min当前最小值, r最终要求的结果  
    int i;
    
    min = a[0] < a[1] ? a[0] : a[1]; 
    r = a[1] - a[0];
    for (i = 2; i < n; i++)
    {
        if (a[i] - min > r)
            r = a[i] - min;
        if (a[i] < min)
            min = a[i];
    }
    printf("%d\n", r);
    return 0;
}




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

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

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

2) max{d[i] - d[j]}  i < j

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


#define DEBUG 

#include <cstdio>

#include <cstdlib>

using namespace std; 

inline int min(int a, int b)

{

    return a < b ? a : b;

}  

intfindMaxDiff1(int n, int* d)

{

    int i = 0;

    int minLeft = d[0];

    int maxDiff = d[1] - d[0];

    for(i = 2; i < n; i++)

    {

        if(d[i - 1] < minLeft)

        {

            minLeft = d[i - 1];

        }

        if(d[i] - minLeft > maxDiff)

        {

            maxDiff = d[i] - minLeft;

        }

    }

    return maxDiff;

}  

intfindMaxDiff2(int n, int* d)

{

    int i = 0;

    int maxLeft = d[0];

    int maxDiff = d[0] - d[1];

    for(i = 2; i < n; i++)

    {

        if(d[i - 1] > maxLeft)

        {

            maxLeft = d[i - 1];

        }

        if(maxLeft - d[i] > maxDiff)

        {

            maxDiff = maxLeft - d[i];

        }

    }

    return maxDiff;

} 

int main()

{

#ifndef DEBUG

    int n = 0, i = 0;

    int* d = NULL; 

    printf("please input the length of array:");

    scanf("%d", &n); 

    d = (int*)malloc(sizeof(int) * n);

    printf("please input the elements of array:");

    for(i = 0; i < n; i++)

    {

        scanf("%d", &d[i]);

    }

#else

    int n = 8;

    int d[8] = {12, 4, 23, 1, 2, 5, 7, 10};

#endif 

    int d1 = findMaxDiff1(n, d);

    int d2 = findMaxDiff2(n, d); 

#ifndef DEBUG

    free(d);

#endif 

    return 0;

}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值