给你一个按照非递减顺序排列的整数数组 nums
,和一个目标值 target
。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target
,返回 [-1, -1]
。
你必须设计并实现时间复杂度为 O(log n)
的算法解决此问题。
解题思路:
1.满足时间复杂度,只能用二分查找法;
2.分别找target元素第一次出现的位置和最后一次出现的位置。
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] result={-1,-1};
int firstPosition,lastPosition;
if(nums==null || nums.length==0) return result;
if(nums[0]>target || nums[nums.length-1]<target) return result;
firstPosition=findFirstPosition(nums,target);
lastPosition=findLastPosition(nums,target);
result[0]=firstPosition;
result[1]=lastPosition;
return result;
}
public static int findFirstPosition(int[] nums,int target){
int left=0,right=nums.length-1;
int mid;
while (left<right){
mid=left+(right-left)/2;
if(nums[mid]>target){
right=mid-1;
}else if(nums[mid]<target){
left=mid+1;
}else {
right=mid;
}
}
if(nums[left]==target)
{
return left;
}
return -1;
}
public static int findLastPosition(int[] nums,int target){
int left=0,right=nums.length-1;
int mid;
while (left<right){
mid=left+(right-left)/2+1;
if(nums[mid]>target){
right=mid-1;
}else if(nums[mid]<target){
left=mid+1;
}else {
left=mid;
}
}
if(nums[left]==target) return left;
return -1;
}
}