C++ 用下一个最大的替换每个元素?
给定一个未排序的数组,将每个元素分配给当前数之后的较大数,如果不存在这样的数,则分配给-1 例3 1 2 5 9 4 8应转换为 5259-18-1C++ 用下一个最大的替换每个元素?,c++,arrays,algorithm,C++,Arrays,Algorithm,给定一个未排序的数组,将每个元素分配给当前数之后的较大数,如果不存在这样的数,则分配给-1 例3 1 2 5 9 4 8应转换为 5259-18-1 O(nlogn)或O(n)进近?这是一个n log(n)解决方案的草图: copy your array in copy: O(n) sort copy: O(n log(n)) for each i in input
O(nlogn)或O(n)进近?这是一个
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))
。但是,我同意这不是一个真正的证明,我可能是错的。以下是在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;
}
int newarr[];
小堆;
heap.push(0);
对于(int i=1),你可能会考虑重新提出你的问题并给它添加一些适当的标签。你到底想要什么?算法还是伪代码?任何特定的语言选择?