找到数组元素的最大差异

时间:2016-07-14 18:16:44

标签: arrays algorithm function max min

示例案例: a[]={1,4,2,5,10,5,4}; //output== 9
这里我们不能改变元素的顺序,总是出现在更大的元素之前 约束是:

1<=n<=10^4
10^-6<=a[i]<=10^-6

这是我的代码,但在某些测试用例中会失败,有人可以在此代码中找到错误。 谢谢。

int maxDiff(int *a,int n)
{
   int MIN_value=INT_MAX;
   int MAX_vale=INT_MIN;
       for(int i=0;i<n;i++) {
        MIN_value=min(MIN_value,a[i]);
        MAX_value=max(a[i]-MIN_value,MAX_value);
    }
 return MAX_value;

}

3 个答案:

答案 0 :(得分:1)

错误必须在此行的逻辑中:

MAX_value=max(a[i]-MIN_value,MAX_value);

使用调试器在不同输入上测试方法,并跟踪MAX_Value是否获得您希望获得的值。

您可以正确设置MAX_value并在之后返回差异:

MAX_value=max(MAX_value,a[i]);

最后:

return MAX_VALUE - MIN_VALUE;

请注意,如果差异为负,则数组为空。

编辑:计算最大值的最小值和最小值之间的差值 left (参见注释):

possibleMinValue = min(possibleMinValue,a[i]);

oldMaxValue = MAX_value;
MAX_value=max(MAX_value,a[i]);

if (oldMaxValue != MAX_value) {
    // Found a new maximal value. Thus, possibleMinValue is a valid min value
    MIN_value = possibleMinValue;
}

答案 1 :(得分:1)

您的函数是错误的,因为如果它在数组末尾找到最小值,则之前的差异计算都将失效。因此,您的错误就在行中:

MAX_value=max(a[i]-MIN_value,MAX_value);

更好的方法是:

int maxDiff(int *a,int n)
{
   if (n == 0 || n == 1)    //If list is empty or has 1 element, return 0
       return 0;
   int MIN_value=INT_MAX;
   int MAX_vale=INT_MIN;
       for(int i=0;i<n;i++) {
        MIN_value=min(MIN_value,a[i]);
        MAX_value=max(a[i],MAX_value);
    }
 return MAX_value - MIN_VALUE;

}

答案 2 :(得分:0)

当找到数组的最小值或最大值时,最好将初始最大值或最小值设置为第一个可能的结果;在这种情况下,它将是数字1 - 数字2.这是为了确保INT_MAX和INT_MIN不会成为您的最终答案。或者,当找到min时,您可以使用INT_MAX作为min的初始值,反之亦然。

int findMaxDiff(int* array, int n) {
    int max = array[i];
    int min = array[i];

    for(int i = 0; i < n; i++) {
         if(array[i] > max) {
            max = array[i]
         }
         if(array[i] < min) {
            min = array[i]
         }
    }
    return max - min;
}