思路:用两次二分查找,分别查找指定元素的第一个和最后一个位置。
直接看代码
// 两次二分查找,分开查找第一个和最后一个
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] reslut = new int[]{-1, -1};
int left = 0;
int right = nums.length - 1;
// 找第一个等于target的位置
while(left <= right){
int mid = (left + right) / 2;
if(nums[mid] == target){ //如果等于target记录该位置
reslut[0] = mid;
right = mid - 1;//重点,向左逼近,继续搜索位于左边的target元素
} else if (nums[mid] > target){
right = mid - 1;
} else {
left = mid + 1;
}
}
// 最后一个等于target的位置
left = 0;
right = nums.length - 1;
while(left <= right) {
int mid = (left + right) / 2;
if(nums[mid] == target){
reslut[1] = mid;
left = mid + 1;//重点,向右逼近,继续搜索位于右边的target元素
} else if (nums[mid] > target){
right = mid - 1;
} else {
left = mid + 1;
}
}
return reslut;
}
}
写二分查找对于边界的处理要细心,建议直接记:循环条件为 <=,left=0 right = nums.length - 1;