算法笔记二分查找问题1

我的写法

//求出序列中第一个大于等于x的元素的位置L
int getL(int A[], int left,int right,int X)
{
	//因为位置L等价于不存在X时X在A中的位置,所以初始left=0 right=n
	//比如说X比当前数组中所有的数都大,则X的位置应为n
	while (left < right)
	{
		int mid = left + (right - left) / 2;
		if (A[mid] == X)
		{
			right = mid;
		}
		else if (A[mid] > X)
		{
			right = mid - 1;
		}
		else
		{
			left = mid + 1;
		}
	}
	return left;
}
//第一个大于x的元素位置R
int getR(int A[], int left, int right, int X)
{
	//初始left==0 right==n
	while (left < right)
	{
		int mid = left + (right - left) / 2;
		if (A[mid] > X)
		{
			right = mid-1;
		}
		else 
		{
			left = mid + 1;
		}
	
	}
	return left;
}

书本写法

//求出序列中第一个大于等于x的元素的位置L
int getL(int A[], int left,int right,int X)
{
	//因为位置L等价于不存在X时X在A中的位置,所以初始left=0 right=n
	//比如说X比当前数组中所有的数都大,则X的位置应为n
	while (left < right)
	{
		int mid = left + (right - left) / 2;
		if (A[mid] >= X)
		{
			right = mid;//往左子区间[left,mid]查找
		}
		else
		{
			left = mid + 1;//往右子区间[mid+1,right]查找
		}
	}
	return left;
}
//第一个大于x的元素位置R
int getR(int A[], int left, int right, int X)
{
	//初始left==0 right==n
	while (left < right)
	{
		int mid = left + (right - left) / 2;
		if (A[mid] > X)
		{
			right = mid;//往左子区间[left,mid]查找
		}
		else 
		{
			left = mid + 1;//往右子区间[mid+1,right]查找
		}
	
	}
	return left;
}

反思

  • 这两种写法对A[mid]>X的选择都狭隘了,格局小了,因为此时A[mid]很有可能就是所要找的那个位置的值,所以不能再缩小范围
posted @ 2021-08-09 15:58  小帆敲代码  阅读(28)  评论(0编辑  收藏  举报