二分查找问题全集OK

http://blog.csdn.net/luckyxiaoqiang/article/details/8937978

1,原始二分查找

题目:给定一个有序(非降序)数组A,求任意一个i使得A[i]等于target,不存在则返回-1

例如:[2,4,6,8,9]找(4) 位置1

1.1 递归版

int bSearch(int a[], int low, int high, int target){
	if(low > high)
		return -1;
	int mid = (low + high)/2;
	if(target<a[mid])
		return bSearch(a,low,mid-1,target);
	else if(target>a[mid])
		return bSearch(a,mid+1,high,target);
	//if(target == a[mid])
	return mid;
}

1.2 迭代版

int search(int A[], int n, int target)
{
	int low = 0, high = n-1;
	while(low <= high)
	{
		// 注意:若使用(low+high)/2求中间位置容易溢出
		int mid = low+((high-low)>>1); 
		if(A[mid] == target)
			return mid;
		else if(A[mid] < target)
			low = mid+1;
		else // A[mid] > target
			high = mid-1;
	}
	return -1;
}

1.3 返回插入位置

给定一个有序(非降序)数组A,若target在数组中出现,返回位置,若不存在,返回它应该插入的位置。

int search(int A[], int n, int target)
{
	int low = 0, high = n-1;
	while(low <= high)
	{
		// 注意:若使用(low+high)/2求中间位置容易溢出
		int mid = low+((high-low)>>1); 
		if(A[mid] == target)
			return mid;
		else if(A[mid] < target)
			low = mid+1;
		else // A[mid] > target
			high = mid-1;
	}
	return -(low+1);
}

之所以返回-(low+1)而不是直接返回-low是因为low可能为0,如果直接返回-low就无法判断是正常返回位置0还是查找不成功返回的0。

2,含重复元素,求=target的最小一个

问题:给定一个有序(非降序)数组A,可含有重复元素,求最小的i使得A[i]等于target,不存在则返回-1

例如:A[2,4,6,8,8,8,9]求8得最小位置3

int search(int A[], int n, int target)
{
	int low = 0, high = n-1;
	while(low <= high)                 
	{
		// 注意:若使用(low+high)/2求中间位置容易溢出
		int mid = low+((high-low)>>1); 
		if(A[mid] == target)
		{
			if(mid > 0 && A[mid-1] == target)
				high = mid-1;           
			else 
				return mid;
		}
		else if(A[mid] < target)
			low = mid+1;             
		else // A[mid] > target
			high = mid-1;           
	}
    return -(low+1);  
}

3,含重复元素,求=target的最大一个

问题:给定一个有序(非降

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值