【问题标题】:Finding MIN MAX pairs from array从数组中查找 MIN MAX 对
【发布时间】:2017-06-30 06:14:27
【问题描述】:

给定一个 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) 甚至更少?

【问题讨论】:

    标签: c++ sorting search binary-search


    【解决方案1】:

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

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

    时间复杂度:O(1)

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

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

    现在第二个数组将包含来自您的数据透视表的增量值。您只需要找到数组 b 的最小值和下一个最小值的索引。这 2 个将是最接近的值,因此它们的差异也最小。

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

    空间复杂度:必须创建一个相同大小的新数组 O(n)。

    【讨论】:

    • 感谢您的帮助。我现在明白了。
    猜你喜欢
    • 1970-01-01
    • 2020-08-19
    • 2021-12-14
    • 2021-05-04
    • 2014-05-26
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 2015-02-18
    相关资源
    最近更新 更多