这是一个算法优化问题。
我有一个整数数组A
,并希望构建数组B
,使B[i]
包含j
中元素的索引A[j]
,使得B[i] = j
{1}})
1. j > i
2. A[j] < A[i]
3. j is minimum of all possible j's.
例如A
是:
A = [1,5,6,4,3,1,2]
然后B
将(从0开始索引)
B = [-1,3,3,4,5,-1,-1]
B[0] = -1
因为索引超过1
的数字少于0
。
B[1] = 3
因为A[3]
是1
中A
的最接近的元素,其中包含的数字小于A[1]=5
。等等。
我使用二叉搜索树知道O(n*log(n))
复杂度的解决方案。如何增加O(n)
的复杂性或证明它是不可能的?
答案 0 :(得分:4)
除非我误解了这个问题,否则你可以通过一个简单的从左到右的扫描来解决它,保留一堆尚未遇到更小元素的索引。 (由于显而易见的原因,与堆栈上的索引相对应的值必须是单调递减的。)
对于输入列表中的每个值,当该值小于堆栈顶部索引(如果有)的值时,将输出列表的对应元素设置为当前输入值的索引并弹出堆栈。
以下小Python程序说明:
def ind(a):
b = [-1] * len(a)
stack = []
for i in range(len(a)):
v = a[i]
while stack and a[stack[-1]] > v:
j = stack.pop()
b[j] = i
stack.append(i)
return b
证明它是O(n)
:for循环显然执行n
次。 while循环的主体(最多)执行最多n
次,因为每个元素只能执行一次。或者,换句话说,每个元素最多被推送和弹出一次。