65.在排序数组中查找元素的第一个和最后一个位置
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
示例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]
提示:
- 0 <= nums.length <= 105
- -109 <= nums[i] <= 109
- nums 是一个非递减数组
- -109 <= target <= 109
代码:
class Solution {
public int[] searchRange(int[] nums, int target) {
//处理空数组情况
if(nums.length == 0)return new int[]{-1,-1};
//第一步:查找target的起始位置(左边界)
int l1 = 0,r1 = nums.length-1;
while(l1<r1){
//取中间位置
int mid = l1+r1>>1;
//目标在左侧,移动右边界
if(nums[mid]>=target)r1 = mid;
//目标在右侧,移动左边界
else l1 = mid+1;
}
//循环结束后,l1和r1指向第一个可能等于target的位置
//第二步:查找target的结束位置(右边界)
int l2 = 0,r2 = nums.length-1;
while(l2<r2){
//中间位置偏向右侧
int mid = l2+r2+1>>1;
//目标在右侧,移动左边界
if(nums[mid]<=target)l2 = mid;
//目标在左侧,移动右边界
else r2 = mid-1;
}
//循环结束后,l2和r2指向最后一个可能等于target的位置
//检查是否找到target,未找到直接返回-1,-1
if(nums[l1] != target&&nums[l2]!=target)return new int[]{-1,-1};
//否则返回返回起始和结束位置
else return new int[]{l1,l2};
}
}

浙公网安备 33010602011771号