这是一个面试问题。
给定一个整数数组和一个区间的流(一对整数),找出在每个流区间内的数组元素。你会使用什么样的数组预处理方法?
将数组排序,然后进行二分查找以找到第一个大于区间起点的元素的索引,再次查找第一个小于区间终点的元素,并返回两者之间的所有整数。每次查询的时间复杂度为O(log N)
,其中N是整数的数量。
答案取决于您的需求:
您有多少个间隔,比如M?
当然,如果M很大且间隔也很大,则使用M * O(N logN)是过度的。
另一种方法:使用O(N)额外空间。
prefix[i] = number of numbers in range 0 to i
可以在O(N)的时间内完成。
现在,每个查询需要O(1)的时间:
query[l,r] = prefix[r] - prefix[l - 1] + 1
因此,总时间复杂度为 O(N logN + M)
。
for (i in original_array) indexed_array[original_array[i]] = original_array[i]
for (j in stream) {
for (k=stream[j][0]; k<=stream[j][1]; k++)
if (indexed_array[k]) return indexed_array[k]
}
或者用索引代替整数:
for (i in original_array) indexed_array[original_array[i]] = i