题目:
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].
思路:
二分法。看到的方法都是在 mid 找到后对左右 ++ -- 得到范围。感觉不能严格的属于 O(logn)。
我用的是对上下界 用二分法 分别查找。
Code:
public int[] searchRange(int[] A, int target) {
int[] result = {-1,-1};
if( A.length == 0 || target<A[0] || target > A[A.length-1]) return result;
int left = 0, right = A.length-1;
int mid = 0;
while(left<right){
mid = (left+right)/2;
if(A[mid] < target) left = mid+1;
else if(A[mid] > target) right = mid-1;
else{
if(mid==0 || A[mid-1] != target){
left = mid;
break;
}
else right = mid-1;
}
}
if(A[left] == target) result[0] = left;
else return result;
right = A.length - 1;
while(left<right){
mid = (left+right)/2;
if(A[mid] > target) right = mid-1;
else{
left = mid;
if(A[mid+1] != target) break;
else left++;
}
}
result[1] = left;
return result;
}
Code2: Recursion进行二分查找
public int[] searchRange(int[] A, int target) {
int[] result = new int[2];
result[0] = getBoundRange(A, 0, A.length-1, target, true);
result[1] = getBoundRange(A, 0, A.length-1, target, false);
return result;
}
public int getBoundRange(int[]A, int l, int r, int target, boolean left){
if(l>r) return -1;
else{
int m = (l+r)/2;
if(A[m]==target){
if(left){
if(m==0 || A[m-1]<target) return m;
else return getBoundRange(A, l, m-1, target, left);
}else {
if(m==A.length-1 || target<A[m+1]) return m;
else return getBoundRange(A, m+1, r, target, left);
}
}
else if (A[m]>target) {
return getBoundRange(A, l, m-1, target, left);
}else {
return getBoundRange(A, m+1, r, target, left);
}
}
}
备注:
二分法不是很熟练