思路
方法一就是先找的target然后从其low开始找第一个target,从起hight位置倒着开始找第一个target。
方法二将目标数target改为target-0.5和target+0.5.分两次二分,每次返回其low位置。
这种思路很巧妙。
代码
方法一:
class Solution {
public int[] searchRange(int[] nums, int target) {
int lo = 0;
int hi = nums.length-1;
int mid = 0;
int[] res = new int[]{-1,-1};
while(lo<=hi){
mid = lo + (hi-lo)/2;
if(nums[mid] == target){
for(int i = lo;i<=hi;i++){
if(nums[i] == target){
res[0] = i;
break;
}
}
for(int j = hi;j>=lo;j--){
if(nums[j] == target){
res[1] = j;
return res;
}
}
}
if(nums[mid]<target){
lo = mid+1;
}else{
hi = mid-1;
}
}
return res;
}
}
方法二:
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] res = new int[]{-1,-1};
int first = fun(nums,target-0.5);
int last = fun(nums,target+0.5);
if(first != last){
res[0] = first;
res[1] = last-1;
}
return res;
}
public int fun(int[] nums, double target){
int lo = 0;
int hi = nums.length-1;
int mid = 0;
while(lo<=hi){
mid = lo + (hi-lo)/2;
if(nums[mid]<target){
lo = mid+1;
}else{
hi = mid-1;
}
}
return lo;
}
}