参考链接
https://labuladong.gitee.io/algo/
二分搜索模板
最基本的二分搜索
int binary_search ( vector< int > nums, int target)
{
int left = 0 ;
int right = nums. size ( ) - 1 ;
while ( left <= right)
{
int mid = left + ( right - left) / 2 ;
if ( nums[ mid] < target)
{
left = mid + 1 ;
}
else if ( nums[ mid] > target)
{
right = mid - 1 ;
}
else if ( nums[ mid] == target)
{
return mid;
}
}
}
寻找左侧边界的二分搜索
int left_bound ( vector< int > nums, int target)
{
int left = 0 ;
int right = nums. size ( ) - 1 ;
while ( left <= right)
{
int mid = left + ( right - left) / 2 ;
if ( nums[ mid] < target)
{
left = mid + 1 ;
}
else if ( nums[ mid] > target)
{
right = mid - 1 ;
}
else if ( nums[ mid] == target)
{
right = mid - 1 ;
}
}
if ( left >= nums. size ( ) || nums[ left] != target)
{
return - 1 ;
}
return left;
}
寻找右侧边界的二分搜索
int right_bound ( vector< int > nums, int target)
{
int left = 0 ;
int right = nums. size ( ) - 1 ;
while ( left <= right)
{
int mid = left + ( right - left) / 2 ;
if ( nums[ mid] < target)
{
left = mid + 1 ;
}
else if ( nums[ mid] > target)
{
right = mid - 1 ;
}
else if ( nums[ mid] == target)
{
left = mid + 1 ;
}
}
if ( right < 0 || nums[ right] != target)
{
return - 1 ;
}
return right;
}