zoukankan      html  css  js  c++  java
  • 二分查找之新手篇——函数使用

    首先介绍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.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
    ",ans);
                else
                printf("%d
    ",*upper_bound(a,a+n,key));
            }
        }
        return 0;
    }
  • 相关阅读:
    NSString
    xib和storyboard的使用方法
    drawRect画线和使用CGContext
    CGAffineTransform动画
    【概念】静态成员
    【c#】Application.Exit和Close有什么不同
    【c#】const和readonly关键字
    【概念】设计模式
    【概念】常见数据结构与算法
    【概念】索引器
  • 原文地址:https://www.cnblogs.com/gti2baby/p/10544878.html
Copyright © 2011-2022 走看看