Given a sorted array of integers, find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1]
.
For example,
Given [5, 7, 7, 8, 8, 10]
and target value 8,
return [3, 4]
.
给定一个有序数组(允许重复)A,给定一个target,在数组A中找到第一次出现target与最后一次出现target的位置[start,end],并返回。若A中不存在target,则返回[-1,-1].
public class SearchforaRange {
public int[] searchRange(int[] A, int target) {
int reSt = -1;
int reEnd = -1;
int low = 0;
int high = A.length - 1;
while (low <= high) {
int med = low + ((high - low) >> 1);
if (A[med] == target) {
if (med > 0 && A[med - 1] != target) {
reSt = med;
break;
} else if (med == 0) {
reSt = 0;
break;
} else {
high = med - 1;
}
} else if (A[med] < target) {
low = med + 1;
} else {
high = med - 1;
}
}
high = A.length - 1;
low = reSt;
if (low != -1) {
while (low <= high) {
int med = low + ((high - low) >> 1);
if (A[med] == target) {
if (med < A.length - 1 && A[med + 1] != target) {
reEnd = med;
break;
} else if (med == A.length - 1) {
reEnd = med;
break;
} else {
low = med + 1;
}
} else if (A[med] < target) {
low = med + 1;
} else {
high = med - 1;
}
}
}
return new int[] { reSt, reEnd };
}
public static void main(String[] args) {
int[] A = { 1 };
int target = 0;
for (int i : new SearchforaRange().searchRange(A, target)) {
System.out.println(i);
}
}
}