Search for a Range
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]
.
题目描述的意思是,从一个有序数组里找到给定目标数的起始下标和结束下标,如果没找到就返回[-1,-1],时间复杂度要为O(logn)。
因为有时间复杂度的限制,直接遍历肯定是不行的,遍历的复杂度为O(n);
很容易想到,可以使用二分查找稍微变化一下,找到目标数后就把数组分成两半继续查找,每次找到后替换开始下标或结束下标就行。
/**
* Created by shily on 2014/9/21.
*/
public class SearchforaRange {
public static void main(String[] args){
int[] a = {8,8,8,8,8,8,8};
int[] b = searchRange(a,8);
System.out.print(b[0]+" "+b[1]);
}
public static int[] searchRange(int[] A, int target) {
int index = binarySearch(A,0,A.length-1,target);
int[] targetIndexs = {-1,-1};
if(index!=-1){
int left = index;
int right = index;
targetIndexs[0] = left;
targetIndexs[1] = right;
while ((left = binarySearch(A,0,left-1,target))!=-1) targetIndexs[0] = left;
while ((right = binarySearch(A,right+1,A.length-1,target))!=-1) targetIndexs[1] = right;
}
return targetIndexs;
}
private static int binarySearch(int[] A,int low,int high,int target){
while(low<=high){
int mid = low + (high-low)/2;
if (A[mid]>target) high = mid - 1;
else if (A[mid]<target) low = mid + 1;
else return mid;
}
return -1;
}
}