我想使用二进制搜索在我的排序数组中找到最后一个元素(打印索引)<=target
。
我已经为此编写了一个代码,并且设置了一个不变式,所以我想知道那是我的代码O(log n),还有什么需要修改的地方吗?
代码:
int l=0,r=n;
while(r-l>1){
int mid=l+(r-l)/2;
if(a[mid]<=target){
l=mid;
}else r=mid;
}if(a[l]>target)return -1;
else return l;
Invariant ==>如果有任何结果,则结果在[l,r)范围内。
如果r和l之间的距离为1,则表示我们已经找到 由于我们的不变性,结果(l)不能为r。 因此,直到(r-l)> 1,我们必须继续循环。
我正确吗?还是需要在代码中涵盖一些极端情况?
另一个问题:
target(==target)
的第一个等于元素的不变性是什么?target(==target)
的最后一个等于元素的不变性是什么?如果可以的话,请为二进制搜索的变体编写不变量和代码。