【问题标题】:Find max difference in array element查找数组元素中的最大差异
【发布时间】:2016-11-17 19:06:39
【问题描述】:

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

}

【问题讨论】:

  • 输出应该是9,10-1 = 9
  • @DevendraPratapSingh 如果用户回答了您的问题,也请接受他的回答 (Accepting Answers: How does it work?)。如果不是,请说明什么仍未得到答复,这是 StackOverflow 的一个非常重要的部分,非常感谢。

标签: arrays algorithm function max min


【解决方案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;

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

编辑:计算最大值与最大值左边的最小值之差(见cmets):

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;
}

【讨论】:

  • 这里 a[i]
  • 在所有情况下,您是否都在寻找 MIN 元素 必须 位于 MAX 元素 left 的差异处,这对吗?然后你应该持有两个 MIN 值。一个叫possibleMinValue,另一个叫minValue。将您当前的 MIN 逻辑替换为 possibleMinValue,并在每次 MAX 值更改时将 possibleMinValue 分配给 minValue
  • 这将是最好的方法。只需执行两个 for 循环。在第一个中,找到MAX_VALUE 及其在数组中的位置,在第二个中,在maxPos 的左侧找到一个MIN_VALUE
  • @VaibhavBajaj 如果你要进行两个循环,时间复杂度也很重要,它肯定会给 TLE。
  • @DevendraPratapSingh 你试过了吗?最大值为2 x 10^4,这肯定会不会给出时间错误。
【解决方案2】:

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

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;

}

【讨论】:

  • 我的答案重复,但完整代码示例 +1。
【解决方案3】:

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

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    相关资源
    最近更新 更多