Search for a Range
The solution is the same with the problem Count the number of occurrences in a sorted array.
public int[] searchRange(int[] nums, int target) {
int i = findFirst(nums, 0, nums.length - 1, target);
if (i == -1) return new int[]{-1, -1};
int j = findLast(nums, 0, nums.length - 1, target);
return new int[]{i, j};
}
private int findFirst(int[] array, int left, int right, int target) {
if (left <= right) {
int mid = (left + right) / 2;
if (array[mid] == target && (mid == 0 || target > array[mid - 1])) { // if we find the first occurred element
return mid;
} else if (target > array[mid]) {
return findFirst(array, mid + 1, right, target);
} else {
return findFirst(array, left, mid - 1, target);
}
} else {
return -1;
}
}
private int findLast(int[] array, int left, int right, int target) {
if (left <= right) {
int mid = (left + right) / 2;
if (array[mid] == target && (mid == array.length - 1 || target < array[mid + 1])) { // if we find the first occurred element
return mid;
} else if (target < array[mid]) {
return findLast(array, left, mid - 1, target);
} else {
return findLast(array, mid + 1, right, target);
}
} else {
return -1;
}
}