给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。
如果目标值不在数组中,则返回[-1, -1]
Yes
样例
给出[5, 7, 7, 8, 8, 10]
和目标值target=8
,
返回[3, 4]
挑战
标签 Expand 时间复杂度 O(log n)
相关题目 Expand
解题思路:
2分搜索,先找最左,在找最右即可。
public class Solution {
/**
*@param A : an integer sorted array
*@param target : an integer to be inserted
*return : a list of length 2, [index1, index2]
*/
public int[] searchRange(int[] A, int target) {
// write your code here
int[] res = new int[2];
if (null == A || 0 == A.length) {
res[0] = -1;
res[1] = -1;
return res;
}
// 获取最左边的target
int left = 0;
int right = A.length - 1;
while (left < right - 1) {
int mid = left + (right - left) / 2;
if (target == A[mid]) {
right = mid;
} else if (target > A[mid]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
if (target == A[left]) {
res[0] = left;
} else if (target == A[right]) {
res[0] = right;
} else {
res[0] = -1;
res[1] = -1;
return res;
}
// 获取最右边的target
left = 0;
right = A.length - 1;
while (left < right - 1) {
int mid = left + (right - left) / 2;
if (target == A[mid]) {
left = mid;
} else if (target > A[mid]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
if (target == A[right]) {
res[1] = right;
} else if (target == A[left]) {
res[1] = left;
} else {
res[0] = -1;
res[1] = -1;
return res;
}
return res;
}
}