用于查找ABS的最小值的算法(A [I] A [J] -K)
Algorithm for finding minimum value of abs(A[i]+A[j]-k)
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二进制搜索"。
相关文章:
- 正在查找文档以获得PS4平台的C++中的设备信息
- 在C++中查找文件
- 模板元程序查找相似的连续类型名称
- 在UNIX系统中使用DIR查找文件的字节大小
- 查找最接近的大于当前数字的数字的索引
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 查找后更改类变量
- 使用正则表达式regex_search在字符串中查找字符串
- 使用gcc从静态链接的文件中查找可选符号
- 在C++中查找范围的长度
- 算法问题:查找从堆栈中弹出的所有序列
- 在Windows中查找扬声器输出的当前音量级别
- 如何在C++中使用X509证书模在令牌中查找私钥
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在 for 循环中查找问题时遇到困难
- 如何在文件中查找字节序列
- 用于查找ABS的最小值的算法(A [I] A [J] -K)
- 如何便携式查找min(INT_MAX,abs(INT_min))
- 在整数数组中查找一对元素,使abs(v[i]-v[j])最小化