二分细节

二分看似简单,但需注意细枝末节

接下来简单探讨几种查询

以严格大于x的第一位数为例子

//序列为m ,x为查询的数 
int find(int x){//假设序列长为n; 
	int l=1,r=n;
	while(l<=r){
		int mid=(l+r)>>1;
		if(m[mid]<=x) l=mid+1;
		else r=mid-1; 
	}//最后出现一定会出现 l==r,此时mid==l 
	// 若m[mid]<=x,则m[mid+1]>x;
	//若m[mid]>x,则 m[l]>x,m[mid-1]<x 
	return m[l];
}

严格大于等于x的情况,只需要去掉等号号即可
严格小于x的情况,将小于符号改为大于符号即可
严格小于等于x的情况,也只需要去掉等号即可

写题过程中还有具体的探讨,可以从这几种方法中迁移应用

posted @ 2023-07-16 15:52  归游  阅读(14)  评论(0编辑  收藏  举报