你有一个数组和一个目标。找出数组的两个元素的区别。而这种差异应该最接近目标。
(即,找i, j
使{({1}})最接近目标)
尝试: 我使用order_map(C ++散列表)来存储数组的每个元素。这将是O(n)。 然后,我将有序元素输出到一个新数组(按数字递增)。
接下来,我使用两个指针。
array[i]- array[j]
问题:
我的算法是否仍在O(n)运行?
答案 0 :(得分:2)
如果数组已经排序,则有一个O(n)算法:让两个指针在数组中向上滑动,只要指向的元素之间的差异小于目标,就会增加上一个,只要它大于目标增加较低的一个。在此过程中,记录到目前为止发现的最佳结果。
当您到达阵列的末尾时,找到了最佳的整体效果。
很容易看出这确实是O(n)。两个指针只会向上移动,在每一步中你只移动一个指针,数组有n个元素。因此,在最多2n步之后,这将停止。
正如在一些评论中已经提到的,如果你需要先对数组进行排序,你需要O(n log n)工作进行排序(除非你可以使用一些基数排序或计数排序)。
答案 1 :(得分:1)
您的搜索阶段是线性的。两指针方法相当于:
Make a copy of sorted array
Add `target` to every entry (shift values up or down) (left picture)
Invert shifted array indexing (right picture)
Walk through both arrays in parallel, checking for absolute difference
All stages are linear (and inverting is implicit in your code)
P.S。是否订购了C ++哈希映射?我怀疑。排序数组创建通常是O(nlogn)(除了计数或基数排序等特殊方法)