【发布时间】:2020-07-12 03:07:05
【问题描述】:
对于正整数数组中的每个整数,找到比当前整数大的最接近整数的索引。另外,我们只需要在当前整数的左边寻找答案。
例如-
Input array - [ 5, 4, 3, 6, 2, 3]
Output array - [ -1, 0, 1, -1, 3, 3]
将 -1 分配给那些没有答案的数字。
有一个简单的 O(n^2) 方法,对每个数字运行一个从前一个数字到数组开头的 for 循环。
for(int i=0; i<n; ++i)
{
output[i] = -1;
for(int j=i-1; j>=0; --j)
{
if(input[j] > input[i])
{
output[i] = j;
break;
}
}
}
当 'n' 很大时,此方法效率低下。有没有更有效的方法?
【问题讨论】:
-
您可以使用已经建立的链接。对于每个元素
x,向左看一个。如果那个大于x,链接到它。否则,它是一个链表的头部,形成一个不断增加的序列 - 跟随它,直到找到一个大于x的数字,或者到达末尾。我认为这个算法是O(n),但看不到一个简单的证明。