整数二分

2021-09-29 常用算法 二分法

# 一、算法思想

二分的本质并不是单调性,即:

  • 如果有单调性一定可以二分;
  • 但二分的题目不一定有单调性。

二分的本质是 边界,其核心在于找到某种性质可以将区间一分为二。

# 二、算法模板

使用模板时,先通过 check 函数找到等于 mid 的边界,然后分情况判断:

  • l = mid,则对应 r = mid - 1,同时计算 mid 时需要 + 1
  • r = mid,则对应 l = mid + 1

说明

为什么计算 mid 时需要 + 1

l = r - 1 时,mid = l + r >> 1 = l,若更新语句为 l = mid,则区间未变化,会导致死循环,因此需要 + 1 操作。

C++

    Go

      # 三、代码实战

      # AcWing 0789


      题目:数的范围

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

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

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

      输入格式

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

      第二行包含 nn 个整数(均在 1100001 \sim 10000 范围内),表示完整数组。

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

      输出格式

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

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

      数据范围

      1n1000001 \le n \le 100000
      qq10000q \le q \le 10000
      1k100001 \le k \le 10000

      输入样例:

      6 3

      1 2 2 3 3 4

      3

      4

      5

      输出样例:

      3 4

      5 5

      -1 -1

      解答代码:

        Last Updated: 2023-01-28 4:31:25