class Solution {
public int[] searchRange(int[] nums, int target) {
int[] result = {-1, -1};
int leftIndex = findPosition(nums, target, true);
/*
* 1、因为①的条件为low <= high,所以返回的左边的下标一定是大于high的,
* 如果high没动过,那么low最后就等于nums.length,说明数组中没有target。
* 为什么还要多加个leftIndex == nums.length判断?因为此时nums[leftIndex]
* 会报索引越界异常。
* 2、如果nums[leftIndex]不等于target,说明数组中没有target。
* */
if (leftIndex == nums.length || nums[leftIndex] != target) {
return result;
}
//计算target的右边的下标。(为什么要减一可以自己手动算一下。)
int rightIndex = findPosition(nums, target, false) - 1;
result[0]=leftIndex;
result[1]=rightIndex;
return result;
}
/*
* left参数的引入,指示我们在遇到target==nums[mid]
* 时应该做什么。如果left为true,那么我们递归查询左区间,
* 否则递归右区间。
* */
public int findPosition(int[] nums, int target, boolean left) {
int low = 0;
int high = nums.length - 1;
//①跳出循环的条件:low <= high
while (low <= high) {
int mid = (low + high) >> 1;
//target小于nums[mid]时,查询左区间
//target等于nums[mid],且left为true时,查询左区间
if (target < nums[mid] || (left && nums[mid] == target)) {
high = mid - 1;
}
/*
* 出现else的情况:
* 1、target大于nums[mid]
* 2、target等于nums[mid]但是left为false
* */
else {
low = mid + 1;
}
}
return low; //返回的是low,所以要对low进行判断
}
}
34、在排序数组中查找元素的第一个和最后一个位置(中等)
最新推荐文章于 2021-12-31 15:44:08 发布