首页 > 编程语言 >整数二分(c++)

整数二分(c++)

时间:2024-08-03 19:00:15浏览次数:12  
标签:二分 arr int mid 整数 50 c++ 数组

1、什么是整数二分:

即可以看做成找数字那个游戏

在一百个数字中找到指定的数字(66)

A出题 B:50

A 50太小了 B : (50+100)/2 = 75

A 75太大了 B :(50 + 75) /2 = 62

所以也可以知道一个结论 :

有单调性,一定可以二分。

可以二分的题目,不一定有单调性。

2、代码思路:

1、寻找到满足条件的最后一个数字

a[]数组 1 2 2 2 3 3 4 4 5 找到最后一个2

check (mid) 是指一个判断 a[mid] <= 2 (要找的数)

int mid = (l + r + 1) / 2;

if( check (mid) ) true: l = mid;

false: r= mid - 1;

2、寻找到满足条件的第一个数字

a[]数组 1 2 2 2 3 3 4 4 5 找到第一个2

check (mid) 是指一个判断 a[mid] >= 2 (要找的数)

int mid = (l + r) / 2;

if( check (mid) ) true: r = mid;

false: l = mid + 1;

3、注意

第一种的mid 多加一个1 这里解释一下原因,

加入 l = r - 1 ;

mid = ( r + L ) /2 = ( 2L + 1 )/2 = L 当判断为true的时候 L= mid = L ,就会一直循环

3、题目

给定一个按照升序排列的长度为 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

输入样例:

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 = 100010;
 int n,q;
 int arr[N];
 ​
 int main()
 {
     //输入数组的个数  还有查询次数
     cin >> n >> q;
     //输入要查询的数组数据
     for (int i = 0; i < n; i++) cin >> arr[i];
     
     while (q--)
     {
         //要去寻找哪个元素
         int k;
         cin >> k;
 ​
 ​
         //1、先去找到起始位置
         int l = 0, r = n - 1;
         while (l < r)
         {
             int mid = (r+l)/2;
             if (arr[mid] >= k) r = mid;
             else l = mid + 1;
         }
         //while循环结束  l = r
         //判断最后找到的这个数字是否是 k
         if (arr[l] == k) cout << l << " ";
         else cout << "-1 -1 " << endl;
 ​
         //2、找结束位置
         l = 0,r = n - 1;
         while (l < r)
         {
             int mid = (r + l + 1) / 2;
             if (arr[mid] <= k) l = mid;
             else r = mid - 1;
         }
         cout << l << endl;
     }
     return 0;
 }

标签:二分,arr,int,mid,整数,50,c++,数组
From: https://blog.csdn.net/weixin_73378557/article/details/140895117

相关文章

  • 【C++BFS】802. 找到最终的安全状态
    本文涉及知识点C++BFS算法LeetCode802.找到最终的安全状态有一个有n个节点的有向图,节点按0到n-1编号。图由一个索引从0开始的2D整数数组graph表示,graph[i]是与节点i相邻的节点的整数数组,这意味着从节点i到graph[i]中的每个节点都有一条边。如果一......
  • 算法DAY 1 二分法查找数的范围
    题目给定一个按照升序排列的长度为n的整数数组,以及q个查询。对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。如果数组中不存在该元素,则返回-1-1。输入格式第一行包含整数n和q,表示数组长度和询问个数。第二行包含n个整数(均在1~10000范围内),表示完......
  • 离散化-c++
    离散化:一、使用情景值域大e.g.0~1e9个数少e.g.0~1e5二、使用方法将数组中的数映射到从0开始的自然数a[]:1、3、100、2000、50000映射到从0开始的自然数:0,1,2,3,4这个过程就是离散化三、两个问题:1.a数组中最开始可能有重复元素,需要去重vector<int>alls;//存......
  • C++ 面向对象基础-构造函数
    目录1.构造函数1.1基本使用1.2函数参数默认值1.3构造初始化列表 1.4隐式调用构造函数2.拷贝构造函数2.1概念2.2浅拷贝2.3深拷贝3.析构函数1.构造函数1.1基本使用构造函数是一种特殊的成员函数,用于创建对象时初始化,写法上有以下要求:●函数名称必......
  • 【C++】实验十五
    题目:1、求一元二次方程ax2+bx+c=0的实根。如果方程没有实根,则利用异常处理处理机制输出有关警告信息2、学校的人事部门保留了有关学生的部分数据(学号、姓名、年龄、住址)。教务部门也保留了学生的另一些数据(学号、姓名、性别,成绩),两个部门分别编写了本部门的学生数据管理程序,其......
  • 【C++】红黑树
     ......
  • C++ 最小生成树 洛谷
    介绍:最小生成树是个啥?其实就像杨志一行人押送生辰纲。抛开最后生辰纲被抢的结局不谈,杨志他们需要到好几个地方,每个地方都需要花点过路费给梁山好汉们打点。比如下面就是一张城市地图:其中每两个图之间的路径长就是要给梁山好汉们打点的银子数。比如1号地点到2号地点的梁山好......
  • 一天速通顺序结构(0基础,软件“Dev-c++”需自己下载)
    今天浅浅带大家速通顺序结构,话不多说,上干货!1,cout语句我们都知道,任何程序都会用到输出,那该怎么实现输出呢,代码实现:#include<iostream>usingnamespacestd;intmain(){cout<<"字符串";cout<<endl;return0;}其中"#include<iostream>"是头文件,起到声明输入输出......
  • C++动态规划(01背包)
    例题1:有 N 个物品,从 1 到 N 编号。对于每个 i(1≤i≤N),物品 i 的重量是 wi​ 价值是 vi​。太郎决定从 N 个物品里选一些放进背包带回家。太郎的背包的容量是 W,因此放进背包的物品的总重量不能超过 W。求太郎带回家的物品的总价值可能达到的最大值。1.贪......
  • 使用C++实现GB28181信令服务中心
    一。背景:   参照开源的GB28181信令服务wvp,准备使用C++实现一套自研的轻量级GB信令服务中心。因此对GB28181协议进行了梳理并且编写了Demo验证,现在把过程整理下来。   希望将来能够实现一套完整的GB28181信令服务。使用了eXosip库。二。GB28181协议栈:三。GB28181信......