二分查找(整数二分)

这篇具有很好参考价值的文章主要介绍了二分查找(整数二分)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、算法简介

二分法,即二分搜索法,是通过不断缩小解可能存在的范围,从而求得问题最优解的方法。

例如,如果一个序列是有序的,那么可以通过二分的方法快速找到所需要查找的元素,相比线性搜索要快不少。

此外二分法还能高效的解决一些单调性判定的问题。

  • 二分的关键不在于单调性,或者说二分的本质并不是单调性。
  • 二分的本质是能否找到一个性质使得左右两个区间的元素分别满足性质和不满足性质。
  • 二分到最后一定可以得到一个结果,lr是相同的,但是要判断是否满足题目条件。

二分算法思路非常简单,但是我们需要特别注意的是下标问题,相信很多人都会遇到二分死循环的问题,所以建议大家背一个模板,又快又准确,保证不会出错的解题。

以下介绍两个模板,区别仅在于l = mid时,mid需要加一,否则会出现死循环:

区间分为:[l, mid]和[mid + 1, r]
while (l < r)
{
    int mid = (l + r) >> 1;
    if (check(mid))	r = mid;
    else	l = mid + 1;
}
区间分为:[l, mid - 1]和[mid, r]
while (l < r)
{
    int mid = (l + r + 1) >> 1;
    if (check(mid)) l = mid;
    else	r = mid - 1;
}

二、题目描述

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

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

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

输入格式

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

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

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

输出格式

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

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

数据范围

\(1 ≤ n ≤ 100000\)
\(1 ≤ q ≤ 10000\)
\(1 ≤ k ≤ 10000\)文章来源地址https://www.toymoban.com/news/detail-711628.html

输入样例:

6 3
1 2 2 3 3 4
3
4
5 

输出样例:

3 4
5 5
-1 -1 

三、题目来源

AcWing算法基础课-789.数的范围

四、算法思路

  • 对于第一轮找起始位置,也就是找到≥x的最小值,所以可以将区间分为左区间<x,右区间≥x
  • 第一轮二分之后要判断是否满足条件,因为有可能数组中没有这个数,这个时候就要根据题目要求进行判断。
  • 对于第二轮找终止位置,也就是找到≤x的最大值,所以可以将区间分为左区间≤x,右区间>x

五、源码

#include <iostream>

using namespace std;

const int N = 100010;

int n, q;
int a[N];

int main()
{
    cin >> n >> q;
    
    for (int i = 0; i < n; ++i) cin >> a[i];
    
    while (q -- )
    {
        int x;
        cin >> x;
        
        int l = 0, r = n - 1;
        while (l < r)
        {
            int mid = (l + r) >> 1;
            if (a[mid] >= x)    r = mid;
            else    l = mid + 1;
        }
        
        if (a[l] != x)  cout << "-1 -1" << endl;
        else
        {
            cout << l << ' ';
            int l = 0, r = n - 1;
            while (l < r)
            {
                int mid = (l + r + 1) >> 1;
                if (a[mid] <= x)    l = mid;
                else    r = mid - 1;
            }
            cout << r << endl;
        }
    }
    
    return 0;
}

到了这里,关于二分查找(整数二分)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 超详解“二分法查找”,一看就会!

    目录 一、 二分法概念用途 二、 超详思维图解 三、  超详使用方法实现代码运行操作 四、   总结 五、   结语 一:二分法概念用途  什么是二分法?有什么作用?一般用在何处? 概念: 二分查找法算法,也叫折半查找算法(对半处理会提高寻找目标数字的效率); 作用

    2024年02月07日
    浏览(53)
  • 33. 搜索旋转排序数组(二分法)

    题目要求必须设计一个时间复杂度为  O(log n)  的算法解决此问题,所以我们可以采用二分法。 Step1. 先把 nums[0] 作为目标值,通过二分法找到旋转点索引; Step2. 如果旋转点索引为0,则数组本身就是升序的,否则思想上可以将数组一分为二,看做两个升序数组。 Step3. 判断

    2024年02月05日
    浏览(31)
  • 【力扣】74. 搜索二维矩阵 <二分法>

    给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非递减顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。 示例 1: 1 3 5 7 10 11 16 20 23 30 34 60 输入:matrix = [[1,3,5,7],[10,

    2024年02月15日
    浏览(28)
  • 算法与人生 揭秘C语言中高效搜索的秘诀——二分查找算法详解

    引言,少年们,大家好。在这里祝大家元旦快乐,我是博主 那一脸阳光 ,今天来介绍二分查找 在计算机科学领域,搜索算法是数据处理和问题解决的重要工具之一。其中,**二分查找算法(Binary Search)**以其卓越的时间复杂度和简洁高效的实现,在众多搜索算法中脱颖而出

    2024年01月17日
    浏览(48)
  • 二分查找(整数二分)

    二分法,即二分搜索法,是通过不断缩小解可能存在的范围,从而求得问题最优解的方法。 例如,如果一个序列是有序的,那么可以通过二分的方法快速找到所需要查找的元素,相比线性搜索要快不少。 此外二分法还能高效的解决一些单调性判定的问题。 二分的关键不在于

    2024年02月08日
    浏览(37)
  • 二分查找--查找整数位置

    描述 二分查找 又叫 折半查找。它采用的是\\\"分治策略\\\"。 给出非降序排列的 n 个整数,查找是否存在某个整数,如果存在,则输出其位置。 输入描述 第一行是一个整数 n(0n≤200000) 表示整数的个数。 接下来是 n 个整数,每个整数之间用一个空格分隔。 接下来一行是一个

    2024年02月13日
    浏览(32)
  • 【算法】—二分法详解

    ①定义: 二分查找算法也称折半搜索算法,对数搜索算法,是一种在 有序数组 中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素

    2024年02月09日
    浏览(36)
  • 算法:二分法---寻找H指数

    1、题目: 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数 。 根据维基百科上 h 指数的定义: h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且每篇论文 至少 被引用

    2024年02月08日
    浏览(35)
  • 06-C++ 基本算法 - 二分法

    在这个笔记中,我们将介绍二分法这种基本的算法思想,以及它在 C++ 中的应用。我们将从一个小游戏猜数字开始,通过这个案例来引出二分法的概念。然后我们将详细讲解什么是二分法以及它的套路和应用。最后,我们还会介绍 C++ STL 中的二分查找函数。让我们一起来探索

    2024年02月16日
    浏览(32)
  • 【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值

    《博主简介》 小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌ 更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍 感谢小伙伴 们点赞、关注! class   Solution :      def   mySqrt ( self ,  x :   int )   -   int :       

    2024年02月04日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包