首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C++基础算法】二分查找(左侧边界)

1.2  二分查找左侧边界

【模板】

//找到x或它的后继

int bsearch(int a[],int n,int x){

  int l = 1, r = n+1, mid;//要加1,有可能本身是最大的数(左闭右开)

  while (l < r) {

      mid = l + (r - l) / 2;// 中间页数

      if(x <= a[mid])r = mid;

      else l = mid + 1;

  } // 终止于:l = r

  if(a[r] == x)return r; // if(a[l] == x)return l;

  else return -1;

}

题目: 二分查找左侧边界

题目描述

请在一个有序不递减的数组中(数组中有相等的值),采用二分查找,找到值x第1次出现的位置,如果不存在x请输出-1。

请注意:本题要求出q个x,每个x在数组中第一次出现的位置。

比如有6个数,分别是:1 2 2 2 3 3,那么如果要求3个数:3 2 5,在数组中第一次出现的位置,答案是:5 2 -1。

输入

第一行,一个整数n,代表数组元素个数(n <= 10^5)

第二行,n个整数,用空格隔开,代表数组的n个元素(1<=数组元素的值<=10^8)

第三行,一个整数q,代表有要求出q个数首次出现的位置(q<=10^5)

第四行,q个整数,用空格隔开,代表要找的数(1<=要找的数<=10^8

输出

输出1行,含q个整数,按题意输出要找的每个数在数组中首次出现的位置,如果不存在这样的数,请输出-1。

样例输入

6

1 2 2 2 3 3

3

3 2 5

样例输出

5 2 -1

标程1:

#include<bits/stdc++.h>

usingnamespacestd;

//查找函数

int judge (int a[], int n, int x) {

  int l = 1, r = n+1, mid;

  while (l < r) {

      mid = l + (r - l) / 2;

      if (x <= a[mid]) r = mid;

      else l = mid + 1;

  }

  if (a[r] == x) return r;

  elsereturn-1;

}

constint M = 1e5 + 2;

int n,a[M],q,x;

int main(){

  scanf ("%d", &n);

  for (int i = 1; i <= n; i++) {

      scanf("%d", &a[i]);

  }

  scanf ("%d", &q);

  for (int i = 1; i <= q; i++) {

      scanf ("%d", &x);

      cout << judge (a, n, x) << " ";

  }

  return0;

}

【标程2】STL

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OnOKcxuZ65MGU6dR5ceCKpIg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券