题目描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
示例1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例3:
输入:nums = [], target = 0
输出:[-1,-1]
想法:
我顶替考研人来写了今天的题,
参考了一下官方题解,发现二分查找就能解决,
由于给出的是排好序的数组,
我们只需要找到 第一个和Target匹配的数的下标 以及 第一个大于Target的数的下标 就能得到结果。
Java代码:
class Solution {
public int[] searchRange(int[] nums, int target) {
int left = binarysearch(nums, target,true);
int right = binarysearch(nums,target,false)-1;
//检测得到的两个值是否符合要求,因为数组中可能不存在target。
if(left <= right && right < nums.length && nums[left] == target && nums[right] == target){
return new int[]{left,right};
}
return new int[]{-1,-1};
}
//二分查找
public int binarysearch(int[] nums, int target, boolean lower){
int left = 0;
int right = nums.length - 1;
int ans = nums.length;
while(left <= right){
int mid = (right + left) / 2;
//如果是left(lower==true),那么就找第一个出现的Target。
//如果是right,那么就找第一个大于target的值。
if(nums[mid] > target || (lower && nums[mid] >= target)){
right = mid - 1;
ans = mid;
}
else{
left = mid + 1;
}
}
return ans;
}
}