由于输入是有序的数组,因而仍旧可以使用二分的方法确定上界和下界。 为了找到左侧边界,在A[mid]大于等于target的时候都要左移right;同理找右侧边界时在A[mid]小于等于target时都要右移left。 对得到的right和left判断其是否在数组范围及其取值是否和target相同来决定输出。
public class Solution {
public int[] searchRange(int[] A, int target) {
int n=A.length;
int l=0,r=n-1;
while(l<=r)
{
int mid = (r+l)/2;
if( A[mid]>=target )
{
r=mid-1;
}
else
{
l=mid+1;
}
}
int left=l;
l=0;r=n-1;
while(l<=r)
{
int mid = (r+l)/2;
if( A[mid]<=target )
{
l=mid+1;
}
else
{
r=mid-1;
}
}
int right=r;
if( left>=l || right<0 || A[left]!=target || A[right] !=target )
{
left=-1;right=-1;
}
int[] res = new int[2];
res[0] = left;
res[1] = right;
return res;
}
}