给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
这题其实主要考察的是两点,利用二分法在排序数组中找到最左边的那个目标值和最右边的目标值
public static void main(String[] args) {
int[] nums = new int[]{5, 7, 7, 8, 8, 10};
System.out.println(binarySearchLeft(nums, 8));
System.out.println(binarySearchRight(nums, 8));
}
public static int[] searchRange(int[] nums, int target) {
if (nums.length <= 0) return new int[]{-1, -1};
return new int[]{binarySearchLeft(nums, target), binarySearchRight(nums, target)};
}
//找到最左侧的目标值
public static int binarySearchLeft(int[] nums, int target) {
int left = 0, right = nums.length - 1;
//从左边无限接近target
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid;
}
}
return nums[left] == target ? left : -1;
}
//找到最右侧的目标值
public static int binarySearchRight(int[] nums, int target) {
int left = 0, right = nums.length - 1;
//从右边无限接近target
while (left < right) {
int mid = 1 + left + (right - left) / 2;//这里+1是防止出现index=4 index=5 mid=4一直循环的情况
if (nums[mid] > target) {
right = mid - 1;
} else {
left = mid;
}
}
return nums[right] == target ? right : -1;
}