用于查找ABS的最小值的算法(A [I] A [J] -K)

Algorithm for finding minimum value of abs(A[i]+A[j]-k)

本文关键字:查找 ABS 最小值 算法 用于      更新时间:2023-10-16

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

我想到对数组进行排序并使用两分球方法(如https://www.geeksforgeeks.org/two-pointers-technique/(并找到最小值。时间复杂性是O(n*log(n))。可以在O(n)

中完成

假设在任何排序后适用 o(n(要求(或您的问题域支持线性时间排序(,您可以在两分球算法(即使对于具有两个不同阵列的情况,大概一个阵列也不需要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排序;这个问题是一种" x y二进制搜索"。