这是Steven Skiena的“算法设计手册”第2版第143页的作业练习。
假设您有一个不同整数的排序序列
{A1,A2,...An}
,从1
到m
,n < m
。提供O(lgN)
算法以查找<= m
中不存在的整数A
。要获得完全信用,请找到最小的此类整数。
排序后的序列和O(lgN)
都建议使用二进制搜索算法。我能想到的唯一方法是运行从1
到m
的数字,并对每个数字进行二进制搜索,以查看它是否存在于序列A
中。但这意味着O(mlgN)
,而不是O(lgN)
。
答案 0 :(得分:4)
当且仅当
时,缺少小于A[k]
的整数
A[k] > k
(使用基于1的索引)。
所以要找到最小的缺失数,二进制搜索。从中间索引m
开始。如果A[m] > m
,则会有一个小于A[m]
的数字,在左半边搜索。否则,如果A[m] == m
,则没有小于m
的数字,并且您搜索右半部分。