在排序数组中查找元素的第一个和最后一个位置
题目链接:在排序数组中查找元素的第一个和最后一个位置
思路:
- 本题就是二分搜索的变形,二分搜索是找到一个数组中存在的目标数值的下标,这里是寻找目标数值的起始和终点位置
- 处理方法只需要稍加改变,找到mid下标
- 该位置值小于目标则舍弃左段
- 若大于则舍弃右段
- 等于时:左右两断都要寻找,分别找到左段中起始,和右段中的终点位置,合在一起作为整个数组的返回值,这里又分为三种情况,起始和终点跨越mid,起始位置在mid,终点位置在mid,对其分别处理即可
public static int[] searchRange(int[] nums, int target) {
int[] result = new int[2];
result[0] = -1;
result[1] = -1;
if(nums==null||nums.length==0) {
return result;
}else if(nums.length==1) {
if(nums[0]!=target)
return result;
else {
result[0] = 0;
result[1] = 0;
return result;
}
}
return findRange(nums,0,nums.length-1,target);
}
public static int[] findRange(int[] nums,int first,int last,int target) {
int[] result = new int[2];
if(first>last) {
result[0] = -1;
result[1] = -1;
return result;
}
int mid = first + ((last-first)>>1);
if(target == nums[mid]) {
int left[] = findRange(nums,first,mid-1,target);
int right[] = findRange(nums, mid+1, last, target);
result[0]=left[0]==-1?mid:left[0];
result[1]=right[1]==-1?mid:right[1];
}else if(target > nums[mid]) {
return findRange(nums,mid+1,last,target);
}else {
return findRange(nums,first,mid-1,target);
}
return result;
}