算法基础——整数二分查找(二)

简介: 算法基础——整数二分查找(二)

整数二分(最常用)

理论图简:

一般二分应用于无非下面这四种情况:

1:找大于等于数的第一个位置 (满足某个条件的第一个数)

2:找小于等于数的最后一个数 (满足某个条件的最后一个数)

3.查找最大值 (满足该边界的右边界)、

4.查找最小值 (满足该边界的左边界)

然后每次使用这这两个模板的时候,先想是找这个区间的左端点还是还是右端点,然后选择用模板

查找左边界

 
int sl(int l , int r , int x)
{
    while(l < r)
    {
        int mid = l + r >> 1;
        if(q[mid] >= x) r = mid;
        else l = mid + 1;
    }
    return l;
}

查找右边界

 
int sr(int l , int r , int x)
{
    while(l < r)
    {
        int mid = r + l + 1 >> 1;
        if(q[mid] <= x) l = mid;
        else r = mid - 1;
    }
    return r;        
}

例题

给定一个按照升序排列的长度为 n 的整数数组,以及 q个查询。

对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。

如果数组中不存在该元素,则返回 -1。

输入格式

第一行包含整数 n 和 q,表示数组长度和询问个数。

第二行包含 n 个整数(均在 1∼10000 范围内),表示完整数组。

接下来 q 行,每行包含一个整数 k,表示一个询问元素。

输出格式

共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置。

如果数组中不存在该元素,则返回 -1 。

数据范围

1≤n≤100000

1≤q≤10000

1≤k≤10000

输入样例:

 
6 3
1 2 2 3 3 4
3
4
5

输出样例:

 
3 4
5 5
-1 -1
 
#include<iostream>
 
using namespace std;
 
const int N=1000010;
int q[N];
 
int sl(int l,int r,int x)
{
    while(l<r)
    {
        int mid=l+r>>1;
        if(q[mid]>=x)r=mid;
        else l=mid+1;
    }
    return l;
}
 
int sr(int l,int r,int x)
{
    while(l<r)
    {
        int mid=r+l+1>>1;
        if(q[mid]<=x)l=mid;
        else r=mid-1;
    }
    return r;        
}
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=0;i<n;i++)scanf("%d",&q[i]);
    while(m--)
    {
        int x;
        scanf("%d",&x);
        int l=sl(0,n-1,x);//查找左边界 并返回下标l
        if(q[l]!=x)cout <<"-1 -1"<<endl;//如果找不到  返回-1 -1
        else
        {
            cout<<l<<' ';//如果找到了  输出左下标
            cout<<sr(0,n-1,x)<<endl;//输出右下标
        }
    }    
    
    return 0;
}


目录
相关文章
|
19天前
|
算法 索引
【算法】——二分查找合集
二分查找基础模版和进阶模版,查找元素位置,搜索插入位置,x的平方根,山脉数组的峰顶索引,寻找峰值,点名
|
5月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
3月前
|
算法 C# 索引
C#二分查找算法
C#二分查找算法
|
3月前
|
存储 算法 C语言
【C语言】二分查找算法
【C语言】二分查找算法
|
3月前
|
消息中间件 存储 算法
一文搞懂二分查找算法!
一文搞懂二分查找算法!
157 0
|
3月前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
42 0
|
5月前
|
人工智能 算法
第一周算法设计与分析:C : 200和整数对之间的情缘
这篇文章介绍了解决算法问题"200和整数对之间的情缘"的方法,通过统计数组中每个数模200的余数,并计算每个同余类中数的组合数来找出所有满足条件的整数对(i, j),使得\( A_i - A_j \)是200的整数倍。
|
5月前
|
存储 算法 Java
深入算法基础二分查找数组
文章深入学习了二分查找算法的基础,通过实战例子详细解释了算法的逻辑流程,强调了确定合法搜索边界的重要性,并提供了Java语言的代码实现。
深入算法基础二分查找数组
|
6月前
|
算法
【算法】二分查找(整数二分和浮点数二分)
算法学习——二分查找(整数二分和浮点数二分)
52 0
【算法】二分查找(整数二分和浮点数二分)
|
5月前
|
算法
【算法】二分查找——二分查找
【算法】二分查找——二分查找