答案
#include <bits/stdc++.h>
//洛谷2249
using namespace std;
const int N = 1e6+10;
int n,m;
int a[N];
int Array_Search(int a[],int len,int x)
{
int L = 0,R = len+1;
while(L+1 < R)
{
int mid = (R+L) >> 1;
if(a[mid] < x ) L = mid;
else R = mid;
}
if(a[R] == x) return R;
return -1;
}
int main() {
cin >> n >> m;
for(int i = 1;i<=n;i++)
{
cin >> a[i];
}
sort(a+1,a+1+n);
for(int i = 1;i<=m;i++){
int t ;
cin >> t;
int res = Array_Search(a,n,t);
cout << res << " ";
}
return 0;
}
思路:
对于二分题,第一件事就是考虑题目给出的数组是否是按升序,或者降序排列的。如果不是,那么先进行处理数组。
对于Array_Search函数,一般都是传入三个量,分别是数组,长度,待查数
无论是查找一个数出现第一次的下标,还是最后一次的下标。L与R都应该放在数组的两侧,而不是待查找数组内部
最后一次出现的下标
int Array_search2(int a[],int len,int x)
{
int L = 0,R = len+1;
while(L+1 < R)
{
int mid = (R+L) >> 1;
if(a[mid] <= x ) L = mid;
else R = mid;
}
if(a[L] == x) return L;
return -1;
}
第一次出现的下标
int Array_Search(int a[],int len,int x)
{
int L = 0,R = len+1;
while(L+1 < R)
{
int mid = (R+L) >> 1;
if(a[mid] < x ) L = mid;
else R = mid;
}
if(a[R] == x) return R;
return -1;
}
重点是while内的判断条件,if内的判断条件,if后的执行条件,return的判断条件和返回值