问题标题: 酷町堂:2772 二分查找2

0
0
已解决
张恩泽
张恩泽
高级天翼
高级天翼

2772   二分查找2

经验值:0 时间限制:1000毫秒

题目描述 Description

从一个有序的整数序列中查找整数k,如果存在输出第一次出现位置,否则输出-1。序列有重复元素,并且单调递增。

输入描述 Input Description

第一行两个整数空格分开,分别表示序列长度n以及查询次数m。
第二行输出n个整数
接下来m行,每行一个整数,表示查询的数字

输出描述 Output Description

输出m行,每行为查询数字的位置(位置从1开始算)。

样例输入 Sample Input

5 3 2 2 3 4 5 3 2 6

样例输出 Sample Output

3 1 -1

数据范围及提示 Data Size & Hint

1000<=n<=100000
1000<=m<=100000

 

 

//CODE
//#pragma GCC optimize(3)
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
using namespace std;
int n, m, k;
int a[100005];
int serch(int k) {
    int l = 1, r = n;
    while (l < r) {
        int mid = (l + r) / 2;
        if (a[mid] == k) {
            return mid; 
        }
        else if (a[mid] > k) {
            l = mid + 1;
        }
        else {
            r = mid;
        }
    }
    if (a[l] == k) {
        return l;
    }
    return -1;
}
int main() {
//  freopen ("题目名.in", "r", stdin);
//  freopen ("题目名.out", "w", stdout);
    cin >> n >> m;
    for (int i = 1; i <= n; i ++) {
        cin >> a[i];
    }
    while (m --) {
        cin >> k;
        cout << serch(k) << endl;
    }
//  fclose (stdin);
//  fclose (stdout);
    return 0;//好习惯!
}

 


0
0
褚俊皓
褚俊皓
新手天翼
新手天翼

f函数部分:

int mid;
    while(l<r){
        mid=(l+r)/2;
        if(a[mid]<k){
            l=mid+1;
        }else{
            r=mid;
        }
    }
    if(a[l]==k)
        return l;
    return -1;

 

我要回答