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

时间:2014-03-08 06:33:19

标签: c++ arrays algorithm

给定一个未排序的数组,在当前数字后将每个元素分配给它的最大数字,如果不存在这样的数字则分配给-1 例如。 3 1 2 5 9 4 8应转换为 5 2 5 9 -1 8 -1

O(nlogn)还是O(n)方法?

2 个答案:

答案 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)用于插入和删除堆