2.7 Search for a range
Given a sorted array of n integers, find the starting and ending position of a given target value.
If the target is not found in the array, return [-1, -1].
Example
Given [5, 7, 7, 8, 8, 10] and target value 8, return [3, 4].
Steps
- Look for start by binary search
- Let start = start, look for end by binary search
Code Example
public int[] searchRange(int[] A, int target) {
int rst[] = new int[2];
if (A==null || A.length ==0) {
rst[0] = -1;
rst[1] = -1;
return rst;
}
//look for start
int start = 0;
int end = A.length-1;
while(start + 1 < end) {
int mid = (start+end)/2;
// looking for start
// when target = A[mid]
// move end to mid, to look for 1st one
if (target > A[mid]) {
start = mid;
}else{
end = mid;
}
}
// check start location
// use else if to check start first
// if target = start, end is not checked
if (A[start] == target) {
rst[0] = start;
}else if (A[end] == target){
rst[0] = end;
}else{
rst[0] = -1;
rst[1] = -1;
return rst;
}
// loop for end
// start = start
end = A.length-1;
while(start + 1< end) {
int mid = (start+end)/2;
// look for end here
// if start =
if (target>= A[mid]) {
start = mid;
}else{
end = mid;
}
}
// check end location
// use else if to check end first, if end == target
// start will be skipped
if (A[end] == target) {
rst[1] = end;
}else if (A[start] == target) {
rst[1] = start;
}else{
// if start is set and end not found
// then end = start (only one number in range)
rst[1] = rst[0];
}
return rst;
}
Common Mistakes
- When search for end and not found, forget to set end = start (when range = 1)
- When confirming exact value of start or end, when look for start, check start first; when look for end, check end first.
// this is an mistack example // check start location, if check end first in else if, // when start = end, start will be overwritten by end if (A[end] == target) { rst[0] = end; }else if (A[start] == target){ rst[0] = start; }else{ rst[0] = -1; rst[1] = -1; return rst; }