二分查找之新手篇——函数使用

C++二分查找详解
本文深入解析C++中二分查找的实现方法,重点介绍了upper_bound()与lower_bound()函数的应用,通过实例演示如何在排序数组中查找特定元素的位置。适合初学者及需要复习二分查找技巧的开发者。

首先介绍c++万能头文件

#include<bits/stdc++.h>

using namespace std;(比较适合偷懒,但是不能确保不会出错)(用还是可以的,粗错了再回头来改嘛)owo

接下来介绍一下两个二分查找函数;

upper_bound()与lower_bound();

ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法(函数)返回一个非递减序列[first, last)中的第一个大于等于值val的地址

ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法(函数)返回一个非递减序列[first, last)中的第一个大于值val的地址

参考:https://blog.youkuaiyun.com/zyq_19960204/article/details/49516981

upper_bound(r,l,key)

r:代表数组中的首地址;l代表数组的末尾地址;key代表我们要查找的那个数值;

upper_bound反回的是数组中(排序完成的数列)大于key的那个数据的地址;

同理lower_bound返回的是大于等于key的那个数据的地址。

参考:https://blog.youkuaiyun.com/sdz20172133/article/details/80101838

例题:入门基础之二分查找 

数组a[]有n个元素,元素值保证不降(即数组满足a1<=a2<=a3<=…<=ak<=…<=an )。

你的任务是,找到数组中大于数字key的所有元素中最小的那个。

如:每组第一排有两个数字n,m,分别代表数组的元素个数和询问的次数。(1<=n,m<=10^5)

第二排有n个整数,表示数组的n个元素的值。(1<=ai<=10^5)
接下来有m排,每排有一个整数key(1<=key<=10^5)
如果没有所求key值用-1代替;

 

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n,m;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        int a[100002];
        for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
        while(m--)
        {
            int key,ans=-1;
            scanf("%d",&key);
            if((upper_bound(a,a+n,key)-a)>n-1)
            printf("%d\n",ans);
            else
            printf("%d\n",*upper_bound(a,a+n,key));
        }
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/gti2baby/p/10544878.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值