示例案例:
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;
}
答案 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;
}