从阵列中寻找MIN MAX对

时间:2017-02-12 04:04:38

标签: c++ sorting search binary-search

给定N个整数的排序数组,我需要找到具有不同索引(i!=j)的所有对。我需要使用(a[j]+a[i]-1)的所有对中的最大(a[j]-a[i]+1)和最小(j>i)。数字并不唯一,但允许配对。数字不能与自己配对。

我现在正在做的事情:

for(i=0;i<n;i++)
{
    for(j=i+1;j<n;j++)
    {
      MAX= max(MAX,a[j] + a[i] -1);
      MIN=min(MIN,a[j]-a[i]+1);
    }
}

这给出了O(n ^ 2)的时间复杂度。有没有办法将它减少到O(nlogn)甚至更少?

1 个答案:

答案 0 :(得分:2)

要找到 max ,您只需要在索引n-1和n-2处添加元素,因为数组已经排序,而最大的2个元素将仅位于结尾处。阵列。数组中没有其他元素会比这些更大,因此它们的总和也将大于任何其他元素的总和。

MAX = a[n-1] + a[n-2] - 1; 

时间复杂度:O(1)

要查找 min ,您应该在数组中查找pivot。我选择从[0]开始。如果空间不是约束,则创建另一个大小相似的数组,并使用数据透视表中的增量值填充它。

int[] b = new int[n];
for(int i=1; i<n; i++)
{
  b[i] = a[i] - a[0];
}

现在第二个数组将具有来自您的数据透视表的delta值。您只需要找到Array b的Minimum和next-Minimum值的索引。这两个将是每个最接近的值,因此它们的差异也是最小的。

时间复杂度:O(n)+ O(n)= O(n)

空间复杂性:必须创建O(n)作为相同大小的新数组。