假设我有一个大小为n的数组A,其中0 <= A [i]&lt; = n。
假设我有2个阵列前进和后退,大小为n,其中:
Forward[i] = index j where
A[j] = min(A[i], A[i+1], ..., A[n-1])
和
Backward[i] = index j where
A[j] = min(A[i], A[i-1], ..., A[0])
我的问题是:
我可以在恒定时间内发现索引k使得A [k] = min(A [1],A [l + 1],...,A [r])吗?
答案 0 :(得分:3)
不,你不能。一个反例是:
A = {0, 4, 3, 2, 3, 4, 0}
Forward = {6, 6, 6, 6, 6, 6, 6}
Backward = {0, 0, 0, 0, 0, 0, 0}
l = 1, k = 5
即Forward
和Backward
在这种情况下无用,您必须搜索O(k-l)
的数组。
答案 1 :(得分:3)
没有。至少不在O(1)时间。反例如下。此处使用0-based
索引。让
index = {0, 1, 2, 3, 4, 5, 6, 7, 8}
A = {1, 3, 5, 7, 9, 6, 4, 2, 0}
Forward = {8, 8, 8, 8, 8, 8, 8, 8, 8}
Backward = {0, 0, 0, 0, 0, 0, 0, 0, 8}
现在,如果我要求您获取范围[3, 7]
中最小值的索引,您将如何进行?
基本上,在[a,b]
范围内找不到它们如果
forward[a] > b
和backward[b] < a
。