阵列不同部分的两个最大值的最大绝对差值是多少?

时间:2017-11-23 20:30:11

标签: java arrays algorithm

那是我在那些日子里失败的面试问题。我朋友中没有人知道错误在哪里以及为什么我被告知我失败了。这就是我决定要求你纠正我的解决方案的原因 给定N个整数数组。整数K将数组分成两个子数组。

  Left part: A[0], A[1]...A[K];
  Right part: A[K+1], A[K+2]... A[N-1];

需要找到每个子阵列中最大值的最大绝对差值。

 MaxDiff = Math.Abs(Max(A[0], A[1]...A[K]) - Max(A[K+1], A[K+2]... A[N-1]))
 Example 1: [1, 3, -3]. If K=1, max difference is |3-(-3)| = 6.
 Example 2: [4, 3, 2, 5, 1, 1]. If K=3, max difference is |5 - 1| = 4.

时间和空间复杂度应为O(n)。 我看到我的解决方案的空间复杂性已经不是O(n)..

int getMaxDifference(int[]A){
    int [] leftMax = new int [A.length];
    int [] rightMax = new int [A.length];
    int max1 = Integer.MIN_VALUE;
    int max2 = Integer.MIN_VALUE;
    int dif = 0;
    int maxDif = 0;

    for (int i = 0; i< A.length; i++){
        if (A[i]>max1) {max1 = A[i];}
        leftMax[i] = max1;
    }

    for (int j = A.length-1; j>0; j--){
        if (A[j]>max2) {max2 = A[j];}
        rightMax[j] = max2;
    }

    for (int k = 0; k<A.length; k++){
    dif = Math.abs(leftMax[k] - rightMax[k]);
    if (dif>maxDif) {maxDif = dif;}}
    return maxDif;
}

3 个答案:

答案 0 :(得分:2)

在你的计划中:

leftMax[k] holds the greatest value in A[0],...,A[k].

rightMax[k] holds the greatest value in A[k],...,A[n-1].

但是,正确的部分应该从索引k + 1开始,而不是从k开始。

因此我建议你改变这一部分:

for (int k = 0; k<A.length; k++){
  dif = Math.abs(leftMax[k] - rightMax[k]);
  if (dif>maxDif) {
    maxDif = dif;
  }
}

for (int k = 0; k<A.length - 1; k++){
  dif = Math.abs(leftMax[k] - rightMax[k + 1]);
  if (dif>maxDif) {
    maxDif = dif;
  }
}

换句话说,要求是计算:

Math.Abs(Max(A[0], A[1]...A[K]) - Max(A[K+1], A[K+2]... A[N-1]))

但我相信你目前的计划是:

Math.Abs(Max(A[0], A[1]...A[K]) - Max(A[k], A[K+1], A[K+2]... A[N-1]))

答案 1 :(得分:2)

问题在于差异计算:
如果输入数组是{4,3,2,5,1,1}
然后左数组变为:{4,4,4,5,5,5}
并且左数组变为:{5,5,5,5,1,1}

要计算差异,您应计算数组kth的{​​{1}}索引和数组leftMAX的{​​{1}}索引之间的差异。

即。 for SubArray {4,3,2,5}考虑leftMax的subArray {4,4,4,5}和SubArray {1,1}考虑rightMax的subArray {1,1}

即。对于SubArray {4,3,2,5}和{1,1},计算应该在leftMax的3rd Index和rightMax的4th index之间。

因此代码成为

(k+1)th

请注意,leftMax的最右边元素和rightMax的最左边元素不会包含在计算中。

答案 2 :(得分:1)

我很确定你误解了这个问题,实际上是“找到2个数组中任意两个元素之间的最大绝对差异”。

答案要求你找到每个数组的最大和最小元素,然后选择最小的绝对值 a - max b 或max a - min b

有一个简单的一次通过O(n)解决方案,可以找到每个数组的最大值和最小值。

K的介绍大多无关紧要,可能还有红鲱鱼。数组引用和开始和结束索引指定了2个不相关的子数组。