题目描述
给出一个有序数组,请在数组中找出目标值的起始位置和结束位置
你的算法的时间复杂度应该在O(log n)之内
如果数组中不存在目标,返回[-1, -1].
例如:
给出的数组是[5, 7, 7, 8, 8, 10],目标值是8,
返回[3, 4].
/**
*
* @param A int整型一维数组
* @param target int整型
* @return int整型一维数组
*/
public int[] searchRange(int[] A, int target) {
int len = A.length;
int result[] = new int[2];
result[0] = -1;
result[1] = -1;
int low1 = 0, high1 = len - 1;
//查找右边界
while(low1 <= high1){
int mid = low1 + (high1-low1)/2;//防止溢出
if(A[mid] <= target){
low1 = mid + 1;
}else{
//如:{2,2,3} 最后一次循环mid=2 high1=2 low=2 此时
//A[mid]=A[2]=3 > 2 利用mid回退前一位
high1 = mid - 1;
}
}
int low2 = 0,high2 = len-1;
//查找子边界
while(low2<=high2){
int mid = low2 + (high2-low2)/2;
if(A[mid] >= target){
high2 = mid -1;
}else{
//
low2= mid + 1;
}
}
if(low2 <= high1){
result[0] = low2;
result[1] = high1;
}
return result;
}