P2249 【深基13.例1】查找(二分查找)

简介: P2249 【深基13.例1】查找(二分查找)

题目描述



输入  n(n≤106) 个不超过 10^9  的单调不减的(就是后面的数字不小于前面的数字)非负整数  a1,a2,…,an,然后进行  m(m≤105) 次询问。对于每次询问,给出一个整数  q(q≤109),要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 -1 。


输入格式



第一行 2 个整数 n 和 m,表示数字个数和询问次数。

第二行 n 个整数,表示这些待查询的数字。

第三行 m 个整数,表示询问这些数字的编号,从 1 开始编号。


输出格式



m 个整数表示答案。


输入输出样例



输入 #1复制

11 3

1 3 3 3 5 7 9 11 13 15 15

1 3 6


输出 #1复制


1 2 -1

分析这个就是二分查找第一位,我们可以直接用函数也可以用底层代码来做。


1.引用函数

#include<bits/stdc++.h>
using namespace std;
const int maxn =1e6+6;
int n, q;
int a[maxn];
int main() {
    cin >> n >> q;
    a[0]=-1;
    for (int i = 1;i<=n;i++) {
        cin >> a[i];
    }
    while (q--) {
        int x;
        cin >> x;
        int pt = lower_bound(a, a+n,x)-a;//二分查找函数 
        if (a[pt] == x) {
            cout << pt << ' ';
        }
        else {
            cout << -1 << ' ';
        }
    }
    return 0;
}


2,底层代码来做

#include <iostream>
#include <cstdio>
using namespace std;
int a[1000100],k; 
int bsearch(int l,int r){
  while (l < r){
    int mid=l+r >> 1;
    if (a[mid] >= k) r=mid ;
    else l=mid+1;
  }
  return l;
}
int main (){
  int n,m;
  scanf ("%d%d",&n,&m);
  int i,j;
  for (i = 0;i < n;i++) scanf ("%d",&a[i]);
  while (m--){
    scanf ("%d",&k);
    int c=bsearch(0,n-1);
    if (a[c] == k) printf ("%d ",c+1);
    else printf ("-1 ");
  }
}
相关文章
|
4月前
|
机器学习/深度学习
数据结构实验之查找四:二分查找
数据结构实验之查找四:二分查找
|
4月前
|
算法
二分查找——OJ题(二)
二分查找——OJ题(二)
38 0
|
4月前
|
算法
二分查找——OJ题(一)
二分查找——OJ题(一)
45 1
|
6月前
|
算法 C++
剑指offer(C++)-JZ51:数组中的逆序对(算法-排序)
剑指offer(C++)-JZ51:数组中的逆序对(算法-排序)
|
11天前
|
人工智能 C++
查找题(二分解法c++)
查找题(二分解法c++)
22 0
|
3月前
|
存储 索引
每日一题——寻找右区间(排序 + 二分查找)
每日一题——寻找右区间(排序 + 二分查找)
|
4月前
|
C#
【力扣每日一题/04】57. 插入区间
【力扣每日一题/04】57. 插入区间
|
4月前
【每日一题Day259】LC167两数之和 II - 输入有序数组 | 双指针 二分查找
【每日一题Day259】LC167两数之和 II - 输入有序数组 | 双指针 二分查找
35 0
|
4月前
【每日一题Day260】LC15三数之和 | 排序 + 双指针
【每日一题Day260】LC15三数之和 | 排序 + 双指针
32 0
|
7月前
|
算法 Java
【算法题目解析】杨氏矩阵数字查找
一道面试时可能遇到的算法问题,杨氏矩阵。可以重点关注思考方式,而不是死记硬背。
22 0