1.题目
给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。
如果目标值不在数组中,则返回[-1, -1]
给出[5, 7, 7, 8, 8, 10]
和目标值target=8
,
返回[3, 4]
2.算法
这道题是二分查找的变体,还是用二分查找,不过用两次就行,一次找左边界,一次找右边界
1,找左边界时,如果有,在边界上则判断条件必须是if (a[mid] < target) {ll = mid + 1} 或者if (a[mid] >= target) {lr = mid - 1}应为等于的话,一直向左移
2、找右边界时,如果有,在边界上则判断条件必须是if (a[mid] <= target) { rl = mid + 1 }或者if (a[mid] > target) {rr = mid - 1;}应为等于的话,一直向右移
public int[] searchRange(int[] a, int target) {
// write your code here
int[] res = {-1, -1};
if (a == null || a.length == 0) {
return res;
}
int ll = 0;
int lr = a.length - 1;
while (ll <= lr) {
int mid = (ll + lr) / 2;
if (a[mid] < target) {
ll = mid + 1;
} else {
lr = mid - 1;
}
}
int rl = 0;
int rr = a.length - 1;
while (rl <= rr) {
int mid = (rl + rr) / 2;
if (a[mid] <= target) {
rl = mid + 1;
} else {
rr = mid - 1;
}
}
if (ll <= rr) { //如果不存在,ll一定停在恰好比目标大的index上,rr一定停在恰好比目标小的index上
res[0] = ll;
res[1] = rr;
}
return res;
}