
public int[] searchRange(int[] nums, int target) {
int [] num = new int[2];
//数组为空的情况
if (nums.length==0){
num[0] = -1;
num[1] = -1;
return num;
}
//二分查找到对应查找的元素,如果没有则返回-1
int flag = commonBinarySearch(nums,target);
//在数组中查找不到元素
if (flag == -1) {
num[0] = -1;
num[1] = -1;
return num;
}
//设置两个指针,指向这个相同元素的头尾
int head = flag;
int rear = flag;
//当到达边界退出
while (head!=0){
// 如果和前一个元素相等,则还需要移动head向前
if (nums[head-1]==nums[head]){
head --;
}else {
// 与前一个元素不相等,找到该元素的最左边界
break;
}
}
//当到达边界退出
while (rear!=nums.length-1){
// 如果和候一个元素相等,则还需要移动rear向前
if (nums[rear]==nums[rear+1]){
rear ++;
}else {
// 与前一个元素不相等,找到该元素的最右边界
break;
}
}
num[0] = head;
num[1] = rear;
return num;
}
public static int commonBinarySearch(int[] arr,int key) {
int low = 0;
int high = arr.length - 1;
int middle = 0; //定义middle
if (key < arr[low] || key > arr[high] || low > high) {
return -1;
}
while (low <= high) {
middle = (low + high) / 2;
if (arr[middle] > key) {
//比关键字大则关键字在左区域
high = middle - 1;
} else if (arr[middle] < key) {
//比关键字小则关键字在右区域
low = middle + 1;
} else {
return middle;
}
}
return -1; //最后仍然没有找到,则返回-1
}