您的位置:首页 > 其它

34 Search for a Range

2016-05-31 22:25 477 查看
利用原数组中的元素是有序的,对数组进行二分,例如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};

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: