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

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

#include<bits/stdc++.h>

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

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

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.csdn.net/zyq_19960204/article/details/49516981

upper_bound(r,l,key)

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

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

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

参考:https://blog.csdn.net/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/ZZ34/p/10544878.html

时间: 2024-10-08 16:27:40

二分查找之新手篇——函数使用的相关文章

二分查找专题总结 - 基础篇

二分查找 - 基础篇 前言 从一个有序的数组中,找到某元素的值,通常思路就是二分查找.二分查找是一个常考的知识点.同时,它也是非常容易出错的一道面试题.左右指针的位置,取值,比较是大于还是大于等于.里面细节很多.死记硬背往往容易出错,只有真正理解思路和多多练习,才能掌握不出错的"二分算法". 本篇文章是二分查找的入门篇.将会介绍最传统,最容易理解与书写的二分算法.并介绍四种二分查找的进阶问题.在理解本文的基础上,后续文章将会再分享二分的各种变形和其他模板. 原题:在有序数组中查找定值

二分查找算法-精简 稳定

//************************************* // 函数名称:FineTab 二分查找算法 ->查温度表 // 函数功能:查找数据在表中相应的位置 表中数据从大到小 // 入口參数:表地址.表长度.要查找的数据 // 出口參数:无 // 返 回 值:数据在表中的位置 //***************************************/ int FineTab(int *a,int TabLong,int data)//查表数据为从大到小排序 {

关于二分查找及其上下界问题的一些思考

个人认为在编程的时候,我的代码能力应该是到位的,但是昨天参加的某公司笔试彻底把这个想法给终结了,才意识到自己是多么的弱.其中印象最深刻的是一道关于二分查找上下界的问题.当时洋洋得意,STL 分分钟搞定,结果到了面试的时候他要我自己重新实现一下.这个时候就拙计了,拿着笔的我是写了改改了写,最后勉强算是完成. 今天反思一下,决定自己再把二分查找重新实现一下.也作为给自己的一个警醒,不要总以为自己能力有多高,总有一天会被打脸的. 一.二分查找思想(参照<算法竞赛入门经典>,感谢刘老师). 在有序表中

分治法(实战篇之二分查找)

啥也不说,先上题!!! 二分查找 Description 给你n个整数和一个整数k.问:n个数中是否存在整数k,如果存在,输出“Yes”,否则输出“No”. Input 输入包含多组测试用例,对于每组测试用例: 输入一个数字n (1 <= n <= 10^7) 接下来输入n个不同的数字Ai( |Ai| <= 10^7). 接下来输入整数k ( |k| <= 10^7).代表要找的数字k Output n个数中是否存在整数k,如果存在输出“Yes”,否则输出“No”.每组数据占一行.

python函数:递归函数及二分查找算法

本文和大家分享的主要是python的递归函数及二分查找算法相关内容,一起来看看吧,希望对大家学习python有所帮助. 一.递归的定义 def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? """ print(s) story() story() 老和尚讲故事 递归的定义 -- 在一个函数里再调用这个函数本身.这种魔性的使用函数的方式就叫做 递归 . 递归的最大深度:997 1.python递归最大层

算法——基础篇——二分查找

     二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.     首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功

【C++】【STL】二分查找函数

binary_search 这个函数的返回值是布尔型,也就是最简单的找到了就为真,没找到就是假. 传入参数有三个,数据集合的左端点,数据集合的右端点,查找的值. 注意这些左端点右端点是要求左开右闭原则的,就是和数学上的左开右闭区间[a, b)一样,右端点是个不会被查阅的值. 一般来说写法类似: bool flag = false; int data[n] = {...};///数据 sort(data, data + n); flag = binary_search(data, data + n

0518Python基础-内置函数-二分查找

1.昨日内容回顾 len() 测试个数 eval() 去掉字符串的引号,返回内部结果 eval('1+1') ---> 2 exec() 去掉字符串的引号,执行内部代码 ret = ''' if True: print(666) ''' exec(ret) range next() iter() reversed() 返回的是迭代器 sorted(iterable,key,reverse)  return list       key zip(iter1,iter2,iter3....) 拉链方

STL二分查找函数的应用

应用二分查找的条件必须是数组有序! 其中二分查找函数有三个binary_serch,upper_bound,lower_bound 测试数组 int n1[]={1,2,2,3,3,4,5}; int n2[]={5,4,3,3,2,2,1}; binary_serch 没有什么好说的,这个很简单,接受三个参数first,last,key三个值.如果在数组中查询到的话,那么就返回1否则返回0 代码 if(binary_search(n1,n1+7,3)) cout<<1<<&quo