以未排序的顺序查找大于给定值的第一个数字

时间:2012-12-08 18:13:22

标签: algorithm data-structures

给定一个正整数序列和一个整数M,返回序列中第一个大于M的数字(如果不存在,则返回-1)。

示例:序列= [2,50,8,9,1],M = 3 - > return = 50

所需的每个查询的O(log n)(在预处理之后)。

我已经考虑过BST了,但是考虑到升序,我只会走一条长路,这不会给我O(logn)时间......

编辑:使用的结构也应该易于修改,即应该可以用给定的元素替换找到的元素并重复搜索另一个M(除了预处理 - O(logn)之外的所有内容)。当然,如果我可以将“第一个更大”更改为“第一个更小”并且不必在算法中进行太多改变,那就太好了。如果它有帮助,我们可以假设所有数字都是正数而且没有重复。

1 个答案:

答案 0 :(得分:10)

创建第二个数组(让它为aux),其中每个元素iaux[i] = max { arr[0],arr[1], ... ,arr[i]}(原始数组中索引为j <= i的所有元素的最大值)

很容易看出这个数组按性质排序,aux上的简单二进制搜索将产生所需的索引。 (如果元素不存在,使用二进制搜索很容易得到比请求元素大的第一个元素。)

时间复杂度为O(n)预处理(仅执行一次)和每次查询O(logn)