如何在不改变顺序的情况下找到数组中两个数字之间的最小差异,使它们的差异为正?

时间:2016-11-19 19:03:43

标签: arrays algorithm

根据这一年,我获得了丰收。
像{3,6,12,1,20,25}。

找到有序年份收获之间收获的最小差异 例如,差异为2,因为3 - 1 = 2.保留顺序,结果为正 排序不适用,因为数字已根据年份排序。

一种方法是找出元素之间的所有正差异,并选择最小的元素 但它需要O(n ^ 2)。

有没有更快的方法呢? 主要任务是找到数组中元素之间的最小差异,而不改变元素的顺序,使它们的差异为正。

2 个答案:

答案 0 :(得分:1)

根据我对该问题的理解,我们需要在所有有效min(a[i] - a[j])i中计算ji < ja[i] > a[j]

您可以从左到右迭代数组,并将所有元素保存在有效支持insertupper_bound操作的数据结构中(例如,C ++中的std::set或Java中的TreeSet

伪代码(类似C ++)可能如下所示:

s = empty set
res = INF
for elem in array: // from left to right
     if s.upper_bound(elem) != s.end(): // checks if there is a larger element
          res = min(res, *s.upper_bound(elem) - elem)
     s.insert(elem)

insert和upper_bound操作需要O(log N)时间,因此总时间复杂度为O(N log N)

答案 1 :(得分:-1)

如果将每个值与每个其他值进行比较,则为O(n ^ 2)。 因此,一个可能的答案可能是采用辅助阵列中的值,将其排序为O(n * ln(n)),然后在一次遍历中找到最小连续差异。 我无法找出O(n)解决方案。 (如果对输入数据给出一些约束,可能会有一个)。