求数组中条件极小差的算法

时间:2013-03-25 01:43:17

标签: arrays algorithm sorting min

假设你有一个不同整数的数组:A = [a1,a2,a3,a4,a5 ......] 我需要找到数组的两个元素,比如A [i]和A [j],使得i小于j且A [j] -A [i]是最小的。

以下是有效的解决方案吗?

  1. 首先对数组进行排序并跟踪每个元素的原始索引(即:ORIGINAL(未排序)数组中元素的索引。
  2. 浏览已排序的数组并计算任何两个连续元素之间的差异,这些元素验证较大元素的原始索引大于较小元素的原始索引的初始条件。
  3. 答案是所有这些差异的最小值。
  4. 以下是一个例子:

    A=[0,-5,10,1]  (in this case the result should be 1 coming from the difference between      A[3] and A[0])
    sort A : newA=[-5,0,1,10]
    since OriginalIndex(-5)>OriginalIndex(0), do not compute the difference
    since OriginalIndex(1)>OriginalIndex(0),we compute the difference =1
    since OriginalIndex(10)>OriginalIndex(1), we compute the difference =9
    The result is the minimal difference, which is 1
    

2 个答案:

答案 0 :(得分:0)

这是一个解决方案,它在时间上是O(n ^ 2),但在空间中是O(1)。在伪代码中:

for i = 0; i < array.length; i++
    for j = i + 1; j < array.length; j++
        if a[j] - a[i] < min
            min = a[j] - a[i]
return min

答案 1 :(得分:0)

如果您想要找到的是正的最小差异,那么基本上,您的问题是:

Find two closest elements in an array.

O(nlogn)解决方案很简单:

  1. sort - O(nlogn)
  2. 获取两个相邻元素之间的差异并找到最小的元素 - O(n)
  3. 因此整体运行时间为O(nlogn)

    您不必关心索引。因为你的内容是abs(A[i]-A[j])=abs(A[j]-A[i]),所以无关紧要i>jj>i