#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
//左闭右闭
int binarySearch1(int n,int t){
int left=1,right=n;
while(left <= right)// 因为left == right的时候,在[left, right]是有效的空间,即相等时可以取到该元素,所以使用 <=
{
int mid = (left + right)/2;
//如果left+right过大,导致和溢出,可以用mid = left + (right - left) / 2,防止溢出left+right
if(a[mid] > t)
{
right = mid - 1;// t即 target目标值 在左区间,所以[left, mid - 1]
}
else if(a[mid] < t)
{
left = mid + 1;// t 在右区间,所以[mid + 1, right]
}
else if(a[mid] == t)
{
return mid;// 数组中找到目标值,直接返回下标
}
}
return -1;
}
//左闭右开区间
int binarySearch2(int n,int t){
int left=1,right=n;
// 版本二
while(left < right)// 因为left == right的时候,在[left, right)是无效的空间,即相等时取不到该元素,所以使用 <
{
int mid = (left + right)/2;
//如果left+right过大,导致和溢出,可以用mid = left + (right - left) / 2,防止溢出left+right
if(a[mid] > t)
{
right = mid;// t 在左区间,所以[left, mid)
}
else if(a[mid] < t)
{
left = mid + 1;// t 在右区间,所以[mid + 1, right)
}
else if(a[mid] == t)
{
return mid;// 数组中找到目标值,直接返回下标
}
}
return -1;
}
//左开右开区间
int binarySearch3(int n,int t){
int left=1,right=n;
while(left < right)// 因为left == right的时候,在(left, right)是无效的空间,即相等时取不到该元素,所以使用 <
{
int mid = (left + right)/2;
//如果left+right过大,导致和溢出,可以用mid = left + (right - left) / 2,防止溢出left+right
if(a[mid] > t)
{
right = mid;// t 在左区间,所以(left, mid)
}
else if(a[mid] < t)
{
left = mid;// t 在右区间,所以(mid, right)
}
else if(a[mid] == t)
{
return mid;// 数组中找到目标值,直接返回下标
}
}
return -1;
}
//左开右闭
int binarySearch4(int n,int t){
int left=1,right=n;
while(left < right)// 因为left == right的时候,在(left, right]是无效的空间,即相等时取不到该元素,所以使用 <
{
int mid = (left + right)/2;
//如果left+right过大,导致和溢出,可以用mid = left + (right - left) / 2,防止溢出left+right
if(a[mid] > t)
{
right = mid - 1;// t 在左区间,所以(left, mid]
}
else if(a[mid] < t)
{
left = mid;// t 在右区间,所以(mid + 1, right]
}
else if(a[mid] == t)
{
return mid;// 数组中找到目标值,直接返回下标
}
}
return -1;
}
int n,m,x;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
while(m--){
cin>>x;
cout<<"方法1:"<<binarySearch1(n,x)<<endl;
cout<<"方法2:"<<binarySearch2(n,x)<<endl;
cout<<"方法3:"<<binarySearch3(n,x)<<endl;
cout<<"方法4:"<<binarySearch4(n,x)<<endl;
}
return 0;
}