找到相邻数字的有序范围内的间隙

时间:2012-12-10 01:24:32

标签: algorithm search

这是Steven Skiena的“算法设计手册”第2版第143页的作业练习。

  

假设您有一个不同整数的排序序列{A1,A2,...An},从1mn < m。提供O(lgN)算法以查找<= m中不存在的整数A。要获得完全信用,请找到最小的此类整数。

排序后的序列和O(lgN)都建议使用二进制搜索算法。我能想到的唯一方法是运行从1m的数字,并对每个数字进行二进制搜索,以查看它是否存在于序列A中。但这意味着O(mlgN),而不是O(lgN)

1 个答案:

答案 0 :(得分:4)

当且仅当

时,缺少小于A[k]的整数
A[k] > k

(使用基于1的索引)。

所以要找到最小的缺失数,二进制搜索。从中间索引m开始。如果A[m] > m,则会有一个小于A[m]的数字,在左半边搜索。否则,如果A[m] == m,则没有小于m的数字,并且您搜索右半部分。