34.在排序数组中查找元素的第一个和最后一个位置
思路:
- 目标值在数组中有三种情况: ①情况一:target不在数组中且位置应该在数组最左边或者最右边 ②情况二:target不在数组中,但target位置应该在数组中间 ③情况三:target在数组中
- 定义两个方法,分别用二分法求出返回数组的左边界和右边界,最后根据左右边界的值来对应三种情况判断返回即可
Tips:
根据二分法判断条件 left<=right,可以考虑用right来作为左边界(计算出来的左边界是不包含target的左边界)
然后用left来作为右边界(计算出来的左边界是不包含target的左边界)。
代码实现
class Solution {
public int[] searchRange(int[] nums, int target) {
int LB = leftBorder(nums, target);
int RB = rightBorder(nums, target);
//第一种
if (LB == -2 || RB == -2) return new int[]{-1,-1};
//第三种
if (RB - LB > 1) return new int[]{LB + 1, RB - 1};
//第二种
return new int[]{-1,-1};
}
//求左边界(不包含)
private int leftBorder(int[] nums, int target) {
int leftB = -2;
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = ((right - left) >> 1) + left;
if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
leftB = right;
}
}
return leftB;
}
//求右边界(不包含)
private int rightBorder(int[] nums, int target) {
int rightB = -2;
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = ((right - left) >> 1) + left;
if (nums[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
rightB = left;
}
}
return rightB;
}
}