Algorithm 在未排序的序列中查找大于给定数字的第一个数字

Algorithm 在未排序的序列中查找大于给定数字的第一个数字,algorithm,data-structures,Algorithm,Data Structures,给定一个正整数序列和一个整数M,返回序列中大于M的第一个数字(如果不存在,则返回-1) 示例:序列=[2,50,8,9,1],M=3->return=50 O(logn),用于每个所需的查询(预处理后) 我想到了BST,但给定一个升序,我得到的只是一条很长的路径,这不会给我O(logn)时间 编辑:使用的结构也应该易于修改,也就是说,应该可以用给定的元素替换找到的元素,并重复搜索另一个M(所有内容-除了预处理-O(logn))。当然,如果我能把“大一号”改成“小一号”,并且不需要在算法上做太多的

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

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

O(logn),用于每个所需的查询(预处理后)

我想到了BST,但给定一个升序,我得到的只是一条很长的路径,这不会给我O(logn)时间


编辑:使用的结构也应该易于修改,也就是说,应该可以用给定的元素替换找到的元素,并重复搜索另一个M(所有内容-除了预处理-O(logn))。当然,如果我能把“大一号”改成“小一号”,并且不需要在算法上做太多的修改,那就太好了。如果有帮助,我们可以假设所有的数字都是正数,并且没有重复。

创建第二个数组(让它成为
aux
),其中每个元素
i
aux[i]=max{arr[0],arr[1],…,arr[i]}
(索引为
j的所有元素的最大值,如果数字已排序,则可以使用二进制搜索。更新:从示例中可以清楚地看到第一个!=最低。第一个=输入中的第一个。给预处理的数据是什么?只有序列?1.数字未排序。2.是的,只有开头给出的序列。+1.注意,您可以删除重复项来自
O(n)
中的
aux
数组的。这将有助于平均情况。很好的解决方案。值得添加有关如何实现
O(n)
的说明preprocessing@icepack:琐碎的我相信:
currMax=-INFINITY;for(inti=0;I
(可以优化为
aux[i]=max(aux[i-1],arr[i])
)好的,很好:)但是我忘记了一个非常重要的事实。请参阅“编辑”。