问题很简单:
给定数组A,对于每个索引i,找到最近的索引j,使得A [j]> A [i]中。如果不存在,则报告-1。输出这些索引按相应的i。
排序我正在考虑的代码如下,但有更快的算法吗?
// Calculate element closest to the left
for (i = 0; i < n; ++i) {
while (stack.top() < a[i]) {
stack.pop();
stack_pos.pop();
}
left[i] = stack.top();
left_pos[i] = stack_pos.top();
left_pos = stack_pos.top();
stack.push(a[i]);
stack_pos.push(i);
}
// Similarly populate right
// Take closest of left and right
for (i = 0; i < n; ++i)
{
closest[i] = closest(left[i], right[i], left_post[i], right_pos[i]);
}
答案 0 :(得分:0)
扫描阵列并找到所有非峰值元素,找到大于它们的邻居。
对于所有峰值元素,将它们与其原始索引值一起推入另一个数组中。以类似的方式重复上述过程(但考虑到邻居&#39;原始索引)。
我们必须进行最多log(n)次迭代,因为在每个阶段只剩下峰值元素。