算法奥林匹克:数组中的条件最小值

时间:2013-03-25 02:39:05

标签: arrays algorithm sorting minimum

我有一个数组A = [a1,a2,a3,a4,a5 ...]我希望找到数组的两个元素,比如A [i]和A [j],这样 i小于j A [j] -A [i]为最小且正面

运行时必须是O(nlog(n))。

此代码是否可以完成这项工作:

  1. 首先对数组进行排序并跟踪每个元素的原始索引(即:ORIGINAL(未排序)数组中元素的索引。

  2. 浏览已排序的数组并计算任何两个连续元素之间的差异,这些元素验证较大元素的原始索引大于较小元素的原始索引的初始条件。

  3. 答案是所有这些差异的最小值。

  4. 以下是一个例子:

    A = [0, -5, 10, 1]
    

    在这种情况下,结果应为1来自A[3]A[0]之间的差异。

    • 排序A:newA = [ - 5,0,1,10]

    • 由于OriginalIndex(-5)> OriginalIndex(0),不计算差异

    • 因为OriginalIndex(1)> OriginalIndex(0),我们计算差值= 1

    • 由于OriginalIndex(10)> OriginalIndex(1),我们计算差值= 9

    结果是最小差异,即1。

2 个答案:

答案 0 :(得分:2)

与其他帖子中的声明相反,对于算法的运行时间没有任何问题。例如,使用heapsort可以在O(n log n)中对数组进行排序,作为问题的上限。在排序后的数组中运行一次的额外O (n)不会再受到损害,因此您仍然可以使用O (n log n)。{/ p>

不幸的是,您的回答似乎仍然不正确,因为它没有给出正确的结果。

仔细查看给出的示例,您应该能够自己验证。示例中给出的数组是:A=[0,-5,10,1]

从0开始计数选择索引i=2j=3符合给定要求i < j2 < 3。计算所选值A[j] - A[i]的差值A[3] - A[2]计算为1 - 10 = -9,这肯定小于算法示例应用程序中计算的1的最小值。

答案 1 :(得分:1)

由于你最小化元素之间的距离,它们必须在排序列表中彼此相邻(如果它们不是那么它们之间的元素与它们中的一个之间的距离更短 - >矛盾)。你的算法在指定的O(nlogn)中运行,所以看起来很好。