Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用下一个最大的替换每个元素?_C++_Arrays_Algorithm - Fatal编程技术网

C++ 用下一个最大的替换每个元素?

C++ 用下一个最大的替换每个元素?,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

给定一个未排序的数组,将每个元素分配给当前数之后的较大数,如果不存在这样的数,则分配给-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:                               (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),你可能会考虑重新提出你的问题并给它添加一些适当的标签。你到底想要什么?算法还是伪代码?任何特定的语言选择?