class Solution {
public int[] searchRange(int[] nums, int target) {
int i1=-1,i2=-1;
// 先找最左边的
int lo=0,hi=nums.length-1;
while(lo<=hi){
int mid=(lo+hi)/2;
if(nums[mid]>target){
hi=mid-1;
}else if(nums[mid]<target){
lo=mid+1;
}else if(nums[mid]==target){
if(mid==0||nums[mid]>nums[mid-1]){
i1=mid;
break;
}else{
// 还不是最左边的target
hi=mid-1;
}
}
}
// 再找最右边的
lo=0;
hi=nums.length-1;
while(lo<=hi){
int mid=(lo+hi)/2;
if(nums[mid]>target){
hi=mid-1;
}else if(nums[mid]<target){
lo=mid+1;
}else if(nums[mid]==target){
if(mid==nums.length-1||nums[mid]<nums[mid+1]){
i2=mid;
break;
}else{
// 还不是最右边的target
lo=mid+1;
}
}
}
return new int[]{i1,i2};
}
}
感觉我这个更容易理解:
其他的和搜索值一样,只是遇到相等的时候,比如要找左边界,那么左边界应该要么是第一个,要么是他左边的元素比他小
那么如果虽然相等,但是不满足上述条件,说明仍然要在该元素的左边搜索,hi=mid-1