【c++入门(2)】 二分2-----二分上下界

本文介绍了如何在非降序序列中使用二分查找寻找元素的首次和最后一次出现位置,分别称为下界和上界。通过实例和代码解释了下界和上界的概念,并提供了相应的查找算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

haluo,我们继续学习…
上节课我们学了怎样在数组中查找一个数,我们样的方法是对半分。

前提条件是是在一个 递增 的数组里进行查询。我再问一下,递增序列和非降序序列有什么区别?

我写两个数组你就知道了。

递增:
1 4 5 7 56 74 88 199
非降序:
1 1 1 2 3 3 4 7 7 16 29 29

通过两个数组我们可以总结出来几个特点:
递增:
①无重复
②每一个数都比前面一个数大
非降序:
①有可能有重复
②整体趋势向上涨(详细情况见数组)

在问一个问题,如果在一个非降序序列中查找x。我们前面的查找程序还生效吗?
现在想想。

我画个图哈
在这里插入图片描述
在图中是二分的步骤,好。这么多x,我们选哪个呢??????
这就要用到我们这节课的知识了。
我们在以前的代码上改动。
下界(非《我的世界》的“下界”)
含义:在非降序序列中,x的第一次出现位置。
以前我们在a[m]中找到了x,是不是就直接返回x了,但现在我们要找到第一次出现的位置,就必须往前找x|右边界左移|。
如果<,就要往前面找|左边界右移|。
如果大于也是|右边界左移|。
代码:

#include <bits/stdc++.h>

using namespace std;
int a[10010];
int fd(int a[],int l,int r,int x){
	while(l<r){
		int m=(l+r)/2;
		if(a[m]<x)l=m+1;
		else r=m;
	}
	return l;
}

上界
含义:与下界相反,x最后出现的位置。
以前我们在a[m]中找到了x,是不是就直接返回x了,但现在我们要找到最后一次出现的位置,就必须往后找x|左边界右移|。
如果<,就要往前面找|左边界右移|。
如果大于还没有找到x,就往前找,是|右边界左移|。

代码:

#include <bits/stdc++.h>

using namespace std;
int a[10010];
int fd(int a[],int l,int r,int x){
	while(l<r){
		int m=(l+r)/2;
		if(a[m]<=x)l=m+1;//此处只需加上'='即可
		else r=m;
	}
	return l;
}

小知识:

想要查询x在非降序序列(或递增序列)中出现的次数,只要将上界-下界就可以获取了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

{∞}

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值