题目描述:
给出一个有序数组,请在数组中找出目标值的起始位置和结束位置
你的算法的时间复杂度应该在O(log n)之内
如果数组中不存在目标,返回[-1, -1].
例如:
给出的数组是[5, 7, 7, 8, 8, 10],目标值是8,
返回[3, 4].
解题思路:
- 首先,对于时间复杂度的要求,我们可以得出结论就是使用二分查找
- 题目要求返回的是起始值和结束值,所以返回的数组只需要两个元素即可
代码如下:
public int[] searchRange(int[] A, int target) {
int low = 0;
int high = A.length - 1;
int mid = 0;
int start = - 1, end = - 1;
while (low <= high) {
mid = (low + high) / 2;
if(A[mid] < target) low = mid + 1;
else if(A[mid] > target) high = mid - 1;
else {
start = end = mid;
while (start >= 0 && A[start] == target) start --;
while (end < A.length && A[end] == target) end ++;
return new int[] {start + 1, end - 1};
}
}
return new int[] {start, end};
}