么?
给定一个未排序的数组和元素数量,对于每个元素,我必须打印自身与数组中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 + " ");
}
}
答案 0 :(得分:0)
关闭袖口,我可以使用一点动态编程建议一些渐近的改进: -
使用quicksort获取排序版本数组中每个元素的索引。取O(n log n)。例如,它应该是: -
sindex = [3 1 3 0 5 2] ( since sorted array is 3 6 9 10 10 15)
您需要填充数组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)最坏情况
现在你知道最右边的elem&lt;的位置了。一世。做foll(取O(n))
for i = 0 to N-1
print i - B[sindex[i]]