基础算法 整数二分

整数二分

题目:

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

以上就是我都对整数二分的理解。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值