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值里的其中之一,随便是哪一个都可以,然后把这个值loc当做新的边界进行左右遍历来确定左右边界,遍历还是用二分查找,只是low和high的移动的判断条件改为是否==target即可。注意何时return low何时return high。(一般找不到的时候返回比该数小的数时返回high,比该数大时返回low,这道题,找第一个为target的应该是比前面的大的,找最后一个target应该是比后面小的)
Source
public class Solution {
public int[] searchRange(int[] A, int target) {
int[] a = {-1, -1};
if(A.length == 0) return a;
int low = 0, high = A.length - 1;
int loc = 0;
while(low <= high){
int mid = low + ((high - low) >> 1);
if(A[mid] > target)
high = mid - 1;
else if(A[mid] < target)
low = mid + 1;
else{
loc = mid;
break;
}
}
if(A[loc] != target) return a; //***
low = 0;
high = loc;
while(low <= high){
int mid = low + ((high - low) >> 1);
if(A[mid] == target) //***
high = mid - 1;
else low = mid + 1;
}
a[0] = low;
low = loc;
high = A.length - 1;
while(low <= high){
int mid = low + ((high - low) >> 1);
if(A[mid] == target) //***
low = mid + 1;
else high = mid - 1;
}
a[1] = high;
return a;
}
}
Test
public static void main(String[] args){
int[] num = {1,2,3,4,5,5,5,5,6,7,8};
int[] b = new Solution().searchRange(num, 5);
System.out.println(b[0]);
System.out.println(b[1]);
}