题目描述
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
示例
思路
本题的目标就是利用二分查找,查找第一个等于目标值的元素下标和最后一个等于目标值的元素下标。
查找第一个等于目标值的元素下标
public static int firstIndexOfElementEqualToTarget(int[] nums, int target){
int left = 0, right = nums.length - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] < target){
// 说明在右半部分
left = mid + 1;
}else{
// 可能找到了,但不确定是否是第一个,继续缩小范围
right = mid - 1;
}
}
if(left < nums.length && nums[left] == target){
return left;
}
return -1;
}
查找最后一个等于目标值的元素下标
public static int lastIndexOfElementEqualToTarget(int[] nums, int target){
int left = 0, right = nums.length - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] <= target){
// 可能找到了,但不确定是否是最后一个,继续缩小范围
left = mid + 1;
}else{
// 大于target,就缩小范围,在左半部分
right = mid - 1;
}
}
if(right >= 0 && nums[right] == target){
return right;
}
return -1;
}
那么此题就直接引用这两个方法即可
public int[] searchRange(int[] nums, int target) {
int[] res = new int[2];
res[0] = firstIndexOfElementEqualToTarget(nums, target);
res[1] = lastIndexOfElementEqualToTarget(nums, target);
return res;
}