根据这一年,我获得了丰收。
像{3,6,12,1,20,25}。
找到有序年份收获之间收获的最小差异
例如,差异为2,因为3 - 1 = 2.保留顺序,结果为正
排序不适用,因为数字已根据年份排序。
一种方法是找出元素之间的所有正差异,并选择最小的元素
但它需要O(n ^ 2)。
有没有更快的方法呢?
主要任务是找到数组中元素之间的最小差异,而不改变元素的顺序,使它们的差异为正。
答案 0 :(得分:1)
根据我对该问题的理解,我们需要在所有有效min(a[i] - a[j])
和i
中计算j
,i < j
和a[i] > a[j]
。
您可以从左到右迭代数组,并将所有元素保存在有效支持insert
和upper_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)解决方案。 (如果对输入数据给出一些约束,可能会有一个)。