整数二分
题目:
给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。
对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 00 开始计数)。
输入格式:
n为输入数组大小;
m为查询次数;
x为查询的数字;
例:
输入:6 1
2
1 2 2 3 3 4
输出:2 3
#include <iostream>
using namespace std;
const int N = 1000;
int n, m;
int q[N];
int main()
{
int x;
cin >> n;
cin >> m;//确定循环次数(查询次数)
for (int i = 0; i < n; i++)
{
cin >> q[i];
}
int mid;//中点值
while (m--)
{
int l = 0, r = n - 1;//确定左边界和有边界
cin >> x;//输入要查询的数字
while (l < r)
{
mid = (l + r) / 2;
if (q[mid] >= x) r=mid;//当中点值大于或等于x时则将中点值确定为新数组的右边界
else
l=mid+1;//反之则为左边界+1;
}
if (q[l] != x)//如果最后没有这个数则输入以下
{
cout << "这个数组不存在这个数字";
}
else
{
cout << l+1 << ' ';
int l = 0, r = n - 1;//重置左右边界
while (l < r)
{
mid = (l + r + 1) / 2;//+1防止死循环,
if (q[mid] <= x)
l = mid;
else
r = mid - 1;
}
cout << l +1<<endl;
}
}
return 0;
}
最后还要说明一下对于二分整数的理解:整数二分有两个模板,一个是区间[l,r]被划分成[l,mid]和[mid+1,r]
时使用的,还有一个是区间[l,r]被划分为[l,mid-1]和[mid,r]
时使用。
这样说明可能有些难懂,通俗易懂的来说,就是两个人玩猜数字游戏,玩家A心里想出一个数字,再给定一个范围,让玩家B猜,如A想的数字为66,范围1~100,第一次B说为50(为范围的中间值),A说,不对,比50要大,于是就缩小了范围(51~100),第二次B说为75(为范围的中间值),A说,不对,比75小,于是进一步缩小了范围(51~74),以此类推,,,,就可以猜到最终的数字为66。
以上就是我都对整数二分的理解。