我有一个包含正数和负数的整数数组A
。我必须找到abs(A[i] + A[j] - k)
的最小值,其中i != j
。
我想过对数组进行排序并使用双指针方法(如https://www.geeksforgeeks.org/two-pointers-technique/所述)并找到最小值。时间复杂度为O(n*log(n))
。可以在O(n)
吗?
答案 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二分搜索”。