题目描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
题目代码
public int[] searchRange(int [] array , int k) {
int start = 0;
int end = array.length - 1;
int first = GetFirstK(array, k,start,end);
int last = GetLastK(array,k,start,end);
if(first>-1 && last>-1){
return new int[]{first,last};
}
return new int[]{-1,1};
}
public int GetFirstK(int [] array , int k,int start,int end) {
if(start>end){
return -1;
}
int mid = (start+end)>>1;
if(array[mid] == k){
// 寻找最左边的k
if(mid>0 && array[mid-1]!=k || mid==0){
return mid;
}else{
end = mid-1;
}
}else if(array[mid]>k){
end = mid-1;
}else{
start = mid+1;
}
return GetFirstK(array, k, start, end);
}
public int GetLastK(int [] array , int k,int start,int end) {
if(start>end){
return -1;
}
int mid = (start+end)>>1;
if(array[mid] == k){
// 寻找最右边的k
if(mid<array.length-1 && array[mid+1]!=k || mid==array.length-1){
return mid;
}else{
start = mid+1;
}
}else if(array[mid]>k){
end = mid-1;
}else{
start = mid+1;
}
return GetLastK(array, k, start, end);
}