解题思路:
为了找到数组中第一个元素和最后一个元素,我们分别创建两个函数来查找。
首先判断函数没有找到元素的情况,以及超出查找边界的情况。
对于寻找第一个元素,当找到目标值,收缩右边界继续查找,因为有重复元素存在,想象下第一个元素和第二个元素都为1的时候。
寻找最后一个元素同理。
.
class Solution {
public int[] searchRange(int[] nums, int target) {
return new int[]{left_bound(nums, target), right_bound(nums, target)};
}
int left_bound(int[] nums, int target){
int left = 0;
int right = nums.length - 1;
//检查边界或没有找到目标元素
if(left >= nums.length || nums[left] != target){
return -1;
}
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] == target){
//找到目标值,收缩右边界
right = mid - 1;
}else if (nums[mid] < target){
//向右查找
left = mid + 1;
}else if (nums[mid] > target){
//向左查找
right = mid - 1;
}
}
return left;
}
int right_bound(int[] nums, int target){
int left = 0;
int right = nums.length - 1;
//检查边界或没有找到目标元素
if(right < 0 || nums[right] != target){
return -1;
}
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] == target){
//找到目标值,收缩左边界
left = mid + 1;
}else if (nums[mid] < target){
left = mid + 1;
}else if (nums[mid] > target){
right = mid - 1;
}
}
return right;
}
}