1.时间复杂度
2、代码
区间
都闭写法:
#include<bits/stdc++.h>
using namespace std;
const int N=1000100;
int a[N];
int x,n;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
scanf("%d",&x);
int l=1,r=n,mid;
while(l<=r){
mid=(l+r)/2;
if(x<a[mid]) r=mid-1;
else if(x>a[mid]) l=mid+1;
else if(x==a[mid]){
printf("%d",mid);
return 0;
}
}
cout<<-1;
return 0;
}
左闭右开写法:
#include<bits/stdc++.h>
using namespace std;
const int N=1000100;
int a[N];
int x,n;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
scanf("%d",&x);
int l=1,r=n+1,mid;//n+1
while(l<r){
mid=(l+r)>>1;
if(x<a[mid]) r=mid;
else if(x>a[mid]) l=mid+1;//r不在讨论范围
else if(x==a[mid]){
printf("%d",mid);
return 0;
}
}
cout<<-1;
return 0;
}
Python版:
def main():
n = int(input())
a = [0] + list(map(int, input().split())) # 使用map和split来读取和转换数字
x = int(input())
l, r = 1, n + 1
while l < r:
mid = (l + r) // 2
if x < a[mid]:
r = mid
elif x > a[mid]:
l = mid + 1
else:
print(mid)
return
print(-1)
if __name__ == "__main__":
main()
注意:求mid的三种写法:
(1)mid=(l+r)/2
(2)mid=(l+r)>>1(括号可以不写)
(3)mid=l+(r-l)/2(可以防止l+r溢出)