本来想先用二分法求出左端点,再计算x的个数,右端点就是左端点+x的个数,但是会超时,所以还是需要二分法求左右两个端点
- 求左端点: 找出第一个>=x的数的位置,如果满足,则移动右端点到mid;否则移动左端点到mid+1处
- 求右端点:找出第一个<=x的数的位置,如果满足,则移动左端点到mid;否则移动左端点到mid-1处,此处的mid求值是(l+r+1)* 2
#include
using namespace std;
const int N = 100010;
int q[N];
int main(){
int n,t,l,x,r,i;
scanf("%d %d",&n,&t);
for(i=0;
i>1;
if(q[mid]>=x) r=mid;
else l=mid+1;
}
if(q[l]==x){
cout<>1;
if(q[mid]<=x) l=mid;
else r=mid-1;
}
cout<
【蓝桥杯|ACwing789. 数的范围 (二分法典型例题)】
推荐阅读
- #|STL迭代器详解
- 算法笔记|HDU - 2041 超级楼梯 (简单DP)
- 特殊算法技巧|康托展开简单记录
- 算法|面试必刷算法TOP101之DP篇 TOP6
- 数据结构学习指导|数据结构初阶(八大排序)
- 数据结构|【初阶数据结构】完全二叉树实现堆排序
- 数据结构|【数据结构初阶】(堆的接口实现和堆排序)
- c语言|《校招大厂中等难度笔试题》纯C语言求解迷宫问题——进来测测你数据结构初阶学的怎么样()
- 初阶数据结构与算法|【初阶数据结构与算法】第七篇(二叉树和堆的基本概念+以及堆的实现)