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]
.
Solution: use binary search, when find the target, do left shift and right shift find the range.
Running Time: O(lg(n)), worst case: O(n).
public class Solution {
public int[] searchRange(int[] A, int target) {
// Note: The Solution object is instantiated only once and is reused by each test case.
int[] result = {-1,-1};
int len = A.length;
int left = 0;
int right = len - 1;
while(left<=right){
int mid = (left+right)/2;
if(A[mid] == target){
int min = mid;
int max = mid;
while(min-1>=0 && A[min] == A[min-1]){
min--;
}
while(max+1<len && A[max] == A[max+1]){
max++;
}
result[0] = min;
result[1] = max;
return result;
}else if(A[mid] < target){
left = mid + 1;
}else{
right = mid - 1;
}
}
return result;
}
}
2nd solution:
A solution of o(logn). Do two runs of binary search for the index of largest element strictly less than target, and the index of largest element strictly less than target+1. The range is between this two indices.
To be continued