P2249 题解

· · 题解

二分查找是一种在有序数组中查找某一特定元素的搜索算法。它的基本思想是将数组分成两部分,然后比较目标元素与中间元素的大小,如果目标元素大于中间元素,则在右半部分继续查找;如果目标元素小于中间元素,则在左半部分继续查找;如果目标元素等于中间元素,则查找成功。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int n,q,x,a[maxn];
int f(int n,int a[],int x){
    int l=1,r=n-1,ans=-1;// 初始化结果为-1,表示未找到
    while(l<=r){
        int mid=(l+r)/2;
        if(a[mid]==x){
            ans=mid;// 找到目标元素,更新结果
            r=mid-1; // 继续在左半部分查找,以找到第一个出现的位置
        }else if(a[mid]<x){
            l=mid+1;
        }else{
            r=mid-1;
        }
    }
    return ans;
}
int main(){
    cin >> n >> q;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);//用cin会超时!
    for(int i=1;i<=q;i++){
        scanf("%d",&x);
        int ans=f(n,a,x);//二分查找函数
        printf("%d ",ans);
    }
    return 0;
}