注意:在第二个二分查找中,mid的取值有所不同。因为如果还是int mid=left+(right-left)/2;当while循环运行到最后时,right=left+1,导致mid=left,然后left=mid,如此循环,会一直无法停下,所以mid需要向上取整。
public int[] searchRange(int[] nums, int target){
if(nums.length==0) return new int[]{-1,-1};
int left=0;
int right=nums.length-1;
//找第一个位置=在大于等于target的数中找最小下标
while(left<right){
int mid=left+(right-left)/2;
if(nums[mid]>=target) right=mid;
else left=mid+1;
}
if(nums[left]!=target) return new int[]{-1,-1};
int start=left;
left=0;
right=nums.length-1;
//找第二个位置=在小于等于target的数中找最大下标
while(left<right){
int mid=left+(right-left+1)/2;
if(nums[mid]<=target) left=mid;
else right=mid-1;
}
return new int[]{start,right};
}