public int[] searchRange(int[] nums, int target) {
//先决条件排除一部分
if(target < nums[0] || target > nums[nums.length - 1]){
return new int[]{-1,-1};
}
//初始化左右边界
int l = 0;
int r = nums.length - 1;
//初始化数组
int[] arr = {-1,-1};
int mid = 0;
//代表左边界是否有被找到
boolean canBeFound = false;
//找arr[0] 也就是左边界
while(l <= r){
//二分法求左边界
mid = l + (r - l) / 2;
if(target == nums[mid]){
//告诉下面我找到了左边界
canBeFound = true;
r = mid - 1;
//赋值
arr[0] = mid;
//如果r经过减一之后小于0,说明到达原数组边界
if(r < 0){
break;
}
//如果这个数的左边那个数比自己小,说明找到了边界
if(nums[r] < nums[mid]){
break;
}
}
//正常操作
if(target < nums[mid]){
r = mid - 1;
}
if(target > nums[mid]){
l = mid + 1;
}
}
if(!canBeFound){
//找不到左边界
return arr;
}
//reset l and r
l = mid;
r = nums.length - 1;
//找右边界,和上面对称即可
while(l <= r){
mid = l + (r - l) / 2;
if(target == nums[mid]){
l = mid + 1;
arr[1] = mid;
if(l >= nums.length){
break;
}
if(nums[l] > nums[mid]){
break;
}
}
if(target < nums[mid]){
r = mid - 1;
}
if(target > nums[mid]){
l = mid + 1;
}
}
return arr;
}
其实还有一种方法是一个while里把左右边界都找出来,这个初次写可能会比较乱,我也还没搞懂,就这样先了,好歹也是手撸出来的,上面的算法。。