我第一次通过算法类的分析,并想知道是否有人可以协助下面的例子。我相信我已经解决了它的O(n)复杂性,但是想知道是否有更好的版本,我没有想到O(logn)?
设A = A [1]< = ...< = A [n + 1]是n个不同整数的排序数组,其中每个整数在[1 ... n + 1]范围内]。也就是说,A中缺少{1,...,n + 1}中的一个整数。描述一个efficeint算法来找到缺失的整数。分析算法的最坏情况复杂性(对数组A的访问次数)。
我所拥有的解决方案相对简单,我相信会导致最坏情况下的N复杂性。也许我在想这个例子,但是有更好的解决方案吗?
我的解决方案
for(i = 1; i < n +1; i++) :
if(A[i-1] > i) :
return i
这背后的逻辑是因为它被排序,第一个元素必须是1,第二个必须是2,依此类推,直到数组中的元素大于它应该是的元素,指示一个元素被遗漏,返回它应该是的元素,我们有一个缺失的元素。
这是正确的逻辑吗?有没有更好的方法呢?
感谢您提前阅读并感谢您的帮助。
答案 0 :(得分:9)
这个逻辑肯定是正确的,但它不足以击败O(n),因为你检查每个元素。
您可以通过观察A[i]==i
来更快地完成此操作,然后j < i
处的所有元素都在适当的位置。这个观察应该足以构建一个在O(log 2 n)中运行的分而治之的方法:
更正式地说,您正在寻找A[i]==i
和A[i+1]==i+2
的位置。您从数组末尾的间隔开始。间隔中间的每个探针将剩余间隔缩小两倍。在某些时候,你只剩下两个元素的间隔。左边的元素是最后一个&#34;正确的&#34;元素,而右边的元素是缺少数字后的第一个元素。
答案 1 :(得分:8)
您可以使用A [i]&gt;二进制搜索第一个索引i一世。如果缺失的整数是k,则对于i = k。
答案 2 :(得分:3)
有时诀窍是以不同的方式思考问题。
在精神上,你只是使用一组布尔值;索引n
的条目是a[n] > n
的真相。
此外,此数组以零个或多个连续false
开头,其余条目均为true
。
现在,你的问题是找到布尔值(排序)数组中true
的第一个实例的索引。