首页 > 其他分享 >二分查找

二分查找

时间:2023-05-11 21:11:30浏览次数:33  
标签:二分 10 int mid long 查找 整数

二分查找是一种在有序数组中查找特定元素的算法。它的基本思想是将数组分成两部分,判断目标元素在哪一部分中,然后继续在该部分中进行查找,直到找到目标元素或者确定目标元素不存在为止。这种算法的时间复杂度为O(log n),比线性查找的时间复杂度O(n)更快。

例如,寻找n个从小到大顺序的中指定的数字位置,可以:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+10,inf = 0x3f3f3f3f;
int a[N];
int n,m; 
void find(int x)
{
    int l = 1,r = n;
    while(l<=r)
    {
        int mid = (l+r)/2;
        if(a[mid]==x)
        {
            cout<<mid<<endl;
            return ;
        }
        else if(a[mid]>x)l = mid+1;
        else r = mid-1;
    }
    cout<<"None"<<endl;
    return;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=m;i++)
    {
        int x;scanf("%d",&x);
        find(x);
    }
     return 0;
}

 

3750: 二分查找

描述

 

将n个从小到大排序的整数(n<1000000)从1~n进行编号,并给出一个待查找的整数,请使用二分法进行查找。

 

 

 

输入

 

第一行为n(n<1000000)和m(m<100000),n表示序列中的元素个数,m表示查询次数。

第二行为n个从小到大排序的整数,以空格分隔;

接下来有m行,每行一个待查询的整数。

 

 

输出

 

对于每次查询,如果能够在序列中找到待查询的整数,则输出编号(如果存在多个编号,返回编号最小的),如果不存在,则输出None。

 

 

样例输入

 10 2

1 2 4 5 6 7 8 9 10 11

10

12

样例输出

 9

None

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+10,inf = 0x3f3f3f3f;
int a[N];
int n,m; 
void find(int x)
{
    int l = 1,r = n;
    while(l<=r)
    {
        int mid = (l+r)/2;
        if(a[mid]==x)
        {
            while(a[mid]==x)mid--;
            cout<<mid+1<<endl;
            return ;
        }
        else if(a[mid]>x)r = mid-1;
        else l = mid+1;
    }
    cout<<"None"<<endl;
    return;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=m;i++)
    {
        int x;scanf("%d",&x);
        find(x);
    }
     return 0;
}

 

7379: 二分查找II

描述

 

将n个从大到小排序的整数(n<1000000)从1~n进行编号,并给出一个待查找的整数,请使用二分法进行查找。

 

 

输入

 

第一行为n(n<1000000)和m(m<100000),n表示序列中的元素个数,m表示查询次数。

第二行为n个从大到小排序的整数,以空格分隔;

接下来有m行,每行一个待查询的整数。

 

 

输出

 

对于每次查询,如果能够在序列中找到待查询的整数,则输出编号(如果存在多个编号,返回编号最大的),如果不存在,则输出None。

 

 

样例输入

 

10 2
11 10 9 8 7 6 5 4 2 1
10
12

样例输出

2
None

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+10,inf = 0x3f3f3f3f;
int a[N];
int n,m; 
void find(int x)
{
    int l = 1,r = n;
    while(l<=r)
    {
        int mid = (l+r)/2;
        if(a[mid]==x)
        {
            while(a[mid]==x)mid++;
            cout<<mid-1<<endl;
            return ;
        }
        else if(a[mid]>x)l = mid+1;
        else r = mid-1;
    }
    cout<<"None"<<endl;
    return;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=m;i++)
    {
        int x;scanf("%d",&x);
        find(x);
    }
     return 0;
}
View Code

 

标签:二分,10,int,mid,long,查找,整数
From: https://www.cnblogs.com/jyssh/p/17392252.html

相关文章

  • 折半查找
    #include<iostream>usingnamespacestd;#defineMAXSIZE50typedefintKeyType;typedefstruct{KeyTypekey;}ElemType;typedefstruct{ElemType*R;intlength;}SSTable;voidCreate(SSTable&T){inti;T.R=newElemType[MAXSIZE......
  • 整体二分总结
    整体二分总结整体二分,就是一种高效离线处理可二分答案的询问的方法,可以代替例如树套树这种高级数据结构。例题:1.P1527[国家集训队]矩阵乘法题意:多次询问,求子矩阵第\(k\)小数。思路:先考虑如果只有一个询问,可以二分答案,把矩阵中小于等于\(mid\)的数赋1,大于的赋0,那么如果子矩阵......
  • python异步字符串查找,asyncio和marisa_trie
     自然语言处理当中经常需要字符串的查找操作,比如通过查找返回字串在文本当中的位置,比如通过匹配实现的nerimportpandasaspdimportasyncio#data=pd.read_csv("guba_fc_result_20230413.csv")data=pd.read_csv("guba_all_post_20230413.csv")filename="cate_gr......
  • 华为OD机试 查找充电设备组合
    最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单 https://dream.blog.csdn.net/article/details/128980730华为OD机试真题大全,用Python解华为机试题|机试宝典 https://dream.blog.csdn.net/article/details/129221789【华为OD机试】全流程解析......
  • 查找命令 (which 、 find )----grep 、 wc 和管道符,echo ,反引号 `
    which命令通过which命令,查看所使用的一系列命令的程序文件存放在哪里find命令按文件大小查找文件语法:find 起始路径 -size 【(+,-)k,m,g  】•+、-表示大于和小于•n表示大小数字•kMG表示大小单位,k(小写字母)表示kb,M表示MB,G表示GB•用于查找指定的文件findfind ......
  • 模板元编程实战--TypeList算法--查找
    从一个类型列表中查找是否包含某一个类型。要从一个类型列表中查找,那么首先要获得每一个类型,然后与特定的类型比较,然后将结果保存起来。首先考虑一下Elem应该如何实现。Elem将会展开参数列表,然后处理,这里使用之前演示Fold高阶函数回调处理:template<TLIn,typenameT>clas......
  • 二分查找和二分答案模板
    1、二分查找关于二分查找主要有三种模板模板1结束条件为l+1==r查找最后一个<=x数的下标(最大化查找,可行区在左侧)intfind(intx){ intl=0,r=n+1;//开区间,数据存储下标为1~nwhile(l+1<r){ intmid=l+r>>1; if(a[mid]<=x)......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素。第一章 数组part01
    今天开始第一天,其实之前也刷过题,也写过博客,可是没有坚持下去;主要是没有动力吧,我又是一个严重的拖延症患者,还好遇到刷到Carl哥的视频,记得是在bilibili分享的二分法视频,感觉讲的挺好的,就加了微信;然后发现有刷题训练营,太适合我这种人了,果断加入,哈哈,废话不多说,开始刷题。  第......
  • 折半查找(二分)
    一、问题描述N个有序整数数列已放在一维数组中, 利用二分查找法查找整数m在数组中的位置。若找到,则输出其下标值:反之,则输出“Not be found!"。二、问题分析二分查找法(也叫折半查找)其本质是分治算法的一种。所谓分治算法是指的分而治之,即将较大规模的问题分解成几......
  • 二分
    寻找重复数寻找重复数classSolution{publicintfindDuplicate(int[]nums){intlen=nums.length;intl=1,r=len-1;while(l<r){intmid=(l+r)/2;intcount=0;for(intnum:......