求ABS最小值的算法(A [i] + A [j] -k)

时间:2018-04-23 23:12:37

标签: c++ algorithm

我有一个包含正数和负数的整数数组A。我必须找到abs(A[i] + A[j] - k)的最小值,其中i != j

我想过对数组进行排序并使用双指针方法(如https://www.geeksforgeeks.org/two-pointers-technique/所述)并找到最小值。时间复杂度为O(n*log(n))。可以在O(n)吗?

完成

1 个答案:

答案 0 :(得分:2)

假设 O(n)要求在任何排序(或您的问题域支持linear-time sorting)后适用,您可以对双指针算法使用一个微不足道的变体(甚至对于具有两个不同数组的情况,可能一个不需要i!=j)。考虑矩形中排列的两个排序数组的元素总和:

    A= 4  9 17 22 29
 B= 7 11 16 24 29 36
   19 23 28 36 41 48
   20 24 29 37 42 49
   35 39 44 52 57 64

假设 k = 40。通过检查最左下的值(较小),我们可以立即排除大部分列包含最接近的值,因为这些值必须更小

    A= 4  9 17 22 29
 B= 7    16 24 29 36
   19    28 36 41 48
   20    29 37 42 49
   35 39 44 52 57 64

所以我们接下来检查右边的值(也就是说我们将指针增加到A)。它大于 k ,因此它消除了该行的其余部分:

    A= 4  9 17 22 29
 B= 7    16 24 29 36
   19    28 36 41 48
   20    29 37 42 49
   35 39 44

接下来的行动必须是--b。以这种方式继续切割矩形的路径:

    A= 4  9 17 22 29
 B= 7          29 36
   19          41
   20    29 37 42
   35 39 44

您可以在完全匹配上移动任一方向(或对角线)(或者如果一次击中就足够提前保释)。通常,路径可以在角落以外退出矩形。对于只有一个数组的情况,你可以在它到达对角线时立即停止(i>=j时),忽略任何最后一个值。

此路径显然具有 O(n)条目,因为它在每个步骤向上或向右(或两者)向上移动。其中一个必须最接近 k (此处,4 + 35和22 + 19并列)。

另见X+Y sorting;这个问题是一种“X + Y二分搜索”。