给你一个按照非递减顺序排列的整数数组 nums
,和一个目标值 target
。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target
,返回 [-1, -1]
。
你必须设计并实现时间复杂度为 O(log n)
的算法解决此问题。
示例 1:
输入:nums = [5,7,7,8,8,10] , target = 8 输出:[3,4]
解法1:
class Solution {
public int[] searchRange(int[] nums, int target) {
int leftBorder = searchLeft(nums,target);
int rightBorder =searchRight(nums,target);
if(leftBorder==-2||rightBorder==-2)return new int[]{-1,-1};
if(rightBorder-leftBorder >1)return new int[]{leftBorder+1,rightBorder-1};
return new int[]{-1,-1};
}
public int searchLeft(int[] nums, int target) {
int left =0;
int right = nums.length -1;
int leftBorder = -2;// 记录一下rightBorder没有被赋值的情况
while(left <= right){
int mid = left + ((right-left)/2);
if(nums[mid]>=target){// 寻找左边界,nums[middle] == target的时候更新right
right = mid-1;
leftBorder = right;
}else{
left = mid+1;
}
}
return leftBorder;
}
public int searchRight(int[] nums, int target) {
int left =0;
int right = nums.length -1;
int rightBorder = -2;
while(left <= right){
int mid = left + ((right-left)/2);
if(nums[mid]>target){
right = mid-1;
}else{// 寻找右边界,nums[middle] == target的时候更新left
left = mid+1;
rightBorder = left;
}
}
return rightBorder;
}
}
解法2:二分查找