二分查找,二分查找变体:寻找大于等于k的元素;小于等于k的元素

基本查找元素

int Binary_search(int x,int n,int arr[50005])
{
	int low=0;int high=n-1;int middle=0;
	while(low<=high)
	{
		middle=(low+high)/2;  
		if(arr[middle]==x) return middle;
		else if(arr[middle]>x) high=middle-1;
		else if(arr[middle]<x) low=middle+1;   
	}
	return -1;
}

寻找小于等于k的值

int Binary_search(int x,int n,int arr[50005])
{
	int low=0;int high=n-1;int middle=0;
	while(low<high)
	{
		middle=(low+high+1)/2;  //因为找小的,导致high最终为middle-1,value比target小,取加一 ;而low的变化始终等于middle 
		if(arr[middle]<=x) low=middle; //这就是我们最终的目的! @
		else high=middle-1; 
	}
	if(arr[low]>x) return -1;//#
	else return low;
}
注意:如果是找小于的话,@处改成小于号,那么下面的出口#必须改成大于等于

寻找大于等于K的值

int Binary_search(int x,int n,int arr[50005])//最终high和low落在同一点! 
{
	int low=0;int high=n-1;int middle=0;
	while(low<high)
	{
		middle=(low+high)/2; //唯一变化的! 
		if(arr[middle]>=x) high=middle;  //这就是我们最终的目的 
		else low=middle+1; 
	}
	if(arr[high]<x) return -1;
	else return high;
}

详细解释见:

补充:lower_bound&upper_bound(默认查询非降有序序列)

查询的是大于、等于

lower_bound:查询:查询大于等于key的元素地址,所以要减去首地址,才是下标。
实现:lower_bound(arr,arr+6,3)-arr;
upper_bound:查询:查询大于key的元素地址,所以要减去首地址,才是下标。
实现:upper_bound(arr,arr+6,3)-arr;
具体应用:1、如求与key值相等的元素个数,可以用lower_bound-upper_bound就是想等的元素
2、求小于等于key的个数,直接输出upper_bound(arr,arr+6,3)-arr恰好就是小于等于key的个数.

在降序序列中(查询小于、等于)

利用greater(),从而达到寻找小于等于、小于key值的元素
lower_bound(arr,arr+6,3,greater<int>())-arr;
upper_bound(arr,arr+6,3,greater<int>())-arr;

补充:其中lower_bound和upper_bound都要减去首地址;
且min_element和max_element也是要减去首地址的,在arr数组中(当然了,是要先排序的,毕竟是二分查找)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值