对于有序序列
{ 1, 4, 5, 7, 8, 9, 11, 13 }
满足大于等于 target 最靠左的位置
比如大于等于 6 最靠左的位置(是元素7,位置是3);比如大于等于 8 最靠左的位置(是元素8,位置是4)。
【参考程序】
// 大于等于 target 的最左的位置
// { 1, 4, 5, 7, 8, 9, 11, 13 }
int findLeft(int arr[], int n, int target) {
if (target > arr[n - 1]) { // 超过了范围
return -1;
}
int left = 0;
int right = n - 1;
int result = -1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] >= target) {
result = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return result;
}
满足小于等于 target 最靠右的位置
比如小于等于 6 最靠右的位置(元素是5,下标是2);比如小于等于 8 最靠右的位置(元素是8,下标是 4)。
【参考程序】
// 小于等于 target 的最右的位置
// { 1, 4, 5, 7, 8, 9, 11, 13 }
int findRight(int arr[], int n, int target) {
if (target < arr[0]) { // 超过了范围
return -1;
}
int left = 0;
int right = n - 1;
int result = -1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] <= target) {
left = mid + 1;
result = mid;
} else {
right = mid - 1;
}
}
return result;
}
// 1 4 5 7 8 9 11 13