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]
.
给出一组排好序数组,和一个数字target,输出他在数组中的起始和终结下标;
如果没有,输出-1;
其实就是二分查找,但是要注意二分查找的边界设置,一个是要查到最左边的位置,一个是要查找到最右边的
位置
public class Solution {
public int[] searchRange(int[] A, int target) {
int find = findOne(A,target, 0,A.length - 1);
int ans[] = new int[2];
int low = 0;
int hight = A.length - 1;
if(find == -1){
low = -1;
hight = -1;
}
else{
low = find; hight = find;
int temp = findLeft(A,target, 0, find - 1);
if(temp != -1) low = temp;
temp = findRight(A, target, find + 1, A.length - 1);
if(temp != -1) hight = temp;
}
ans[0]= low;
ans[1] = hight;
return ans;
}
public int findOne(int[] arr, int target,int low,int hight){
while(low <= hight){
int mid = (low + hight) /2 ;
if(arr[mid] == target){
return mid;
}
else if(arr[mid] < target){
low = mid + 1;
}
else {
hight = mid - 1;
}
}
return -1;
}
public int findLeft(int arr[], int target, int low , int hight){
int find = findOne(arr,target, low, hight);
int temp = find;
while(temp != -1){
find = temp;
temp = findOne(arr,target,low, find - 1);
}
return find;
}
public int findRight(int arr[], int target, int low , int hight){
int find = findOne(arr,target, low, hight);
int temp = find;
while(temp != -1){
find = temp;
temp = findOne(arr,target,find + 1, hight);
}
return find;
}
}