利用原数组中的元素是有序的,对数组进行二分,例如Given [5,
7, 7, 8, 8, 10]
and target value 8,
若找到的序列ele[lo]==ele[hi]&&ele[lo]==target,说明这[lo,hi]区间的元素都为target,二分的结果有四种
1. 左边找到+右边找到,因为数组有序,找到的区间一定相邻! 这时候合并一下取 left=左边left ,right=右边right即可。
2. 左边找到+右边没找到,返回左边区间
3. 左边没找到+右边找到,返回右边区间
4. 左边没找到+右边没找到,返回[-1,-1]
注意以上情况均为迭代处理。
public int[] searchRange(int[] nums, int target)
{
return searchaux(nums, target, 0, nums.length-1);
}
public int[] searchaux(int[] nums,int target,int lo,int hi)
{
if(nums[lo]==nums[hi]&&nums[lo]==target)
return new int[] {lo,hi};
if(lo==hi)
return new int[] {-1,-1};
int mid=(lo+hi)>>1;
int[] lret=searchaux(nums, target, lo, mid);
int[] rret=searchaux(nums, target, mid+1, hi);
int leftindex=-1;
int rightindex=-1;
if(lret[0]>=0&&rret[0]>=0)
{
leftindex=lret[0];
rightindex=rret[1];
}
else if(lret[0]>=0)
{
leftindex=lret[0];
rightindex=lret[1];
}
else if(rret[0]>=0)
{
leftindex=rret[0];
rightindex=rret[1];
}
return new int[] {leftindex,rightindex};
}