1、题目描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
2、算法分析
本题的数组为升序数组,使用二分查找解决此问题。
明确几个点:
1、找左半边的位置
①二分查找的范围:左边界left = 0,有边界right=nums.length - 1
②假如数组中存在target,我们要找数组的最左边界nums[mid] >= target。当nums[mid]>=target的时候,在左半边位置找,right = mid;
③当nums[mid] < target的时候,往右半区域找,left = mid + 1;
2、找右半边的位置
①二分查找的范围:左边界left = 0,有边界right=nums.length - 1
②假如数组存在target且存在右边界,我们去二分查找<=target的最右边界
当nums[mid]<=target时,往右半区域找,left =mid。
③当nums[mid] > target的时候,往左区域查找,right = mid - 1;
3、代码实现
class Solution {
public int[] searchRange(int[] nums, int target) {
if(nums == null || nums.length == 0){
return new int[]{-1,-1};
}
int left = 0,right = nums.length - 1;
while(left < right){
int mid = left + (right - left) / 2;
if(nums[mid] >= target){
right = mid;
}else{
left = mid + 1;
}
}
// 数组中没有target元素
if(nums[left] != target){
return new int[]{-1,-1};
}
int resL = left;
left = 0;
right = nums.length - 1;
while(left < right){
int mid = (left + right + 1) / 2;
if(nums[mid] <= target){
left = mid;
}else{
right = mid - 1;
}
}
return new int[]{resL,right};
}
}