[C++基础]实现lower_bound

STL

Posted by JinFei on March 9, 2020

实现lower_bound

lower_bound算法返回第一个大于等于给定值所在的位置。 设置两个指针start和last,其中start指向数组的起始位置,last指向数组末尾位置之后的位置。当start和last指向相同位置时循环结束。mid指向[start,last)区间的中间位置,当中间位置元素值大于等于给定val时,说明第一个大于等于val值在mid位置的左边,更新last为mid。当中间位置元素值小于给定的val时,说明第一个大于等于val值在mid右边,不包括mid所在的位置。更新start为mid+1。

int myLowerBound(vector<int> &data, int k)
{
	int start = 0;
	int last = data.size();
	while (start < last)
	{
		int mid = (start + last) / 2;
		if (data[mid] >= k)
		{
 			last = mid;
 		}
 		else
 		{
 			start = mid + 1;
 		}
 	}
 	return start;
}

实现upper_bound

upper_bound算法返回第一个大于给定元素值所在的位置 设置两个指针start和last,其中start指向数组的起始位置,last指向数组末尾位置之后的位置,当start和last指向相同位置时循环结束,mid指向[start,last)区间的中间位置,当中间位置元素值小于等于给定val时,说明第一个大于val值在mid位置的右边更新start为mid+1。当中间位置元素值大于给定元素时,说明第一大于在mid左边,包括mid所在位置,所以更新last为mid。

int myUpperBound(vector<int> &data, int k)
{
	int start = 0;
	int last = data.size();
	while (start < last)
	{
		int mid = (start + last) / 2;
		if (data[mid] <= k)
		{
 			start = mid + 1;
 		}
 		else
 		{
 			last = mid;
 		}
 	}
 	return start;
}