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

Arrays 如何在不改变顺序的情况下找到数组中两个数之间的最小差,使它们的差为正?,arrays,algorithm,Arrays,Algorithm,我得到了一个以吨为单位的年收成 比如{3,6,12,1,20,25} 找出订购年份之间的最小收获差异。 举个例子,差是2,因为3-1=2。保持秩序,结果为正 排序不适用,因为数字已按年份排序。 一种方法是找出元素之间的所有正差异,然后选择最小的一个。 但是它需要O(n^2)。 有没有更快的方法呢? 主要任务是在不改变元素顺序的情况下,找出数组中元素之间的最小差异,以使它们的差异为正。根据我对这个问题的理解,我们需要在所有有效的i和j中计算min(a[i]-a[j]) 您可以从左到右迭代数组,并保

我得到了一个以吨为单位的年收成
比如{3,6,12,1,20,25}

找出订购年份之间的最小收获差异。
举个例子,差是2,因为3-1=2。保持秩序,结果为正
排序不适用,因为数字已按年份排序。

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

有没有更快的方法呢?

主要任务是在不改变元素顺序的情况下,找出数组中元素之间的最小差异,以使它们的差异为正。

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

您可以从左到右迭代数组,并保持数据结构中的所有元素,这些数据结构支持<代码> INSERT 和 UpPulfBoosix>代码>操作(例如,<代码> STD::SET< /Cult>在C++中或<代码>树目录爪哇中)。p> 伪代码(类似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)

插入和上限操作需要
O(logn)
时间,因此总的时间复杂度是
O(nlogn)

如果将每个值与其他值进行比较,它将是O(N^2)。 所以一个可能的答案可能是在一个辅助数组中取值,在O(n*ln(n))中排序,然后在一次遍历中找到最小的连续差异。
我想不出一个O(n)解。(如果对输入数据有一些限制,可能会有一个)。

我想你一定误解了“连续”这个词。您的描述不正确,或者您对它的理解不正确。在您的示例中,3和1不是连续的。这个问题很难回答。我会改进的。我想这个问题是正确的。停止向下旋转你只需要一对绝对差值最小的元素吗?它成功了!我不知道treeSet可以使元素保持有序。@skrtbhtngr我认为这是不言自明的。我们只需从左到右遍历所有元素,使用标准库数据结构找到比给定元素大的最小元素,然后将新元素添加到此结构中。