在未排序的数组上,元素之间的距离

时间:2012-10-09 02:12:47

标签: arrays quicksort binary-search mergesort divide-and-conquer

么?

给定一个未排序的数组和元素数量,对于每个元素,我必须打印自身与数组中farest元素之间的元素数量,如果没有数字-1

示例:

输入: 10 6 10 3 9 15 输出: 3 1 1 -1 -1 -1

我已经做到了,但是我的教授告诉它可以做得更有效率,当然我实际上在做o(n ^ 2)。分而治之?,二元搜索?

我的解决方案:

public void MedidaMolestia(int A[], int  N)
    {
    int i=0,  temp=0, k=N-1, j=0;

    for(i=0; i<N; i++) 
    {
        temp = A[i];

        for(j=N-1;j>i ; j--)
        {
            if(A[j]<temp)
            break;
        }

        if(i==j)
            System.out.print(-1 + " ");

        else 
            System.out.print((j-i)-1 + " ");
    }
}

1 个答案:

答案 0 :(得分:0)

关闭袖口,我可以使用一点动态编程建议一些渐近的改进: -

  1. 使用quicksort获取排序版本数组中每个元素的索引。取O(n log n)。例如,它应该是: -

    sindex = [3 1 3 0 5 2] ( since sorted array is 3 6 9 10 10 15)
    
  2. 您需要填充数组B,以便B [i]存储从小于i的索引的最右边开始的第一次出现。做如下: -

    Initialize B to [N, N,...]
    filledpos = N;
    for j = N-1 to 0 inclusive
        if(sindex[j] < filledpos) do 
        for i = sindex[j] to filledpos - 1 inclusive 
        // like if you find the 3rd smallest element fill B[4],.. B[filledpos]
           B[i] = j
        filledpos = sindex[j]
    

    对于你的例子B = [2 2 3 3 5 5]。采取O(n)最坏情况

  3. 现在你知道最右边的elem&lt;的位置了。一世。做foll(取O(n))

    for i = 0 to N-1
       print i - B[sindex[i]]