给定一个未排序的数组,在当前数字后将每个元素分配给它的最大数字,如果不存在这样的数字则分配给-1 例如。 3 1 2 5 9 4 8应转换为 5 2 5 9 -1 8 -1
O(nlogn)还是O(n)方法?
答案 0 :(得分:0)
以下是n log(n)
解决方案的草图:
copy your array in copy: O(n)
sort copy: O(n log(n))
for each i in input: (n loops)
perform a dichotomic search to find i in copy. O(log(n))
replace i in input O(1)
=> loop is in O(n log(n))
有几个地方可以进行优化,但我非常怀疑可能有一个渐近更好的(例如:O(n)
)算法。原因是,如果不是替换每个数字而是替换下一个数字的值,而是编写下一个数字的位置,那么您的数组中有一个已排序的链接列表,排序至少知道为O(n log(n))
。但是,我同意这不是一个真实的证据,我可能是错的。
答案 1 :(得分:0)
以下是在O(nlogn)
中执行此操作的方法: -
int newarr[];
MinHeap heap;
heap.push(0);
for(int i=1;i<n;i++) {
while(arr[heap.top()]<arr[i]) {
k = heap.pop();
newarr[k] = arr[i];
}
heap.push(arr[i]);
}
// No larger elements
while(!heap.isEmpty) {
k = heap.pop();
newarr[k] = -1;
}
时间复杂度:从上面的代码中,堆中只有n个插入和n个删除,因此它是O(nlogn)
,其中O(logn)
用于插入和删除堆