二分法查找最左和最右
1、满足大于等于 target 最靠左的位置;
比如 1 4 5 7 8 9 11 13
大于等于 6 最靠左的位置(是元素7,位置是3);比如大于等于 8 最靠左的位置(是元素9,位置是5)。
2、满足小于等于 target 最靠右的位置;
小于等于 6 最靠右的位置(元素是5,下标是2);比如小于等于 8 最靠右的位置(元素是7,下标是 3)。
【输入样例】
//右侧最左的位置
int binarySearch(int arr[], int n, int target) {
if (target >= arr[n - 1])
return -1;
int left = 0;
int right = n - 1;
while (left < right) { //不能 <= ,相等了而没有return,会死循环
//取中心时靠近左端点
int mid = left + (right - left) / 2;
if (arr[mid] > target)
right = mid; // mid不能-1
else
left = mid + 1;
}
return left;
}
//左侧最右的位置
int binarySearch(int arr[], int n, int target) {
if (target <= arr[0]) return -1;
int left = 0;
int right = n - 1;
while (left < right) {
//取中心时靠近右端点
int mid = left + (right - left + 1) / 2;
if (arr[mid] >= target)
right = mid - 1;
else
left = mid; // mid不能+1
}
return right;
}