
看到时间复杂度要求:O(logn),就知道是折半查找,很简单,先折半查找target的下标,之后向左右找nums[left],nums[right]等于target的下标,返回就行。
class Solution {
public int[] searchRange(int[] nums, int target) {
int mid=findHalf(nums,target);//找target的下标(只是其中一个下标)
if(mid==-1)return new int[]{-1,-1};
int left=mid;//左边界下标
int right=mid;//右边界下标
while(left>0)
{
if(nums[left-1]==target)
{
left--;
}
else
{
break;
}
}
while(right<nums.length-1)//因为要涉及到下标right+1,所以,right只能到nums.length-1
{
if(nums[right+1]==target)
{
right++;
}
else
{
break;
}
}
return new int[]{left,right};
}
public int findHalf(int[] nums,int target)
{
int left=0;
int right=nums.length-1;
while(left<=right)
{
int mid=(left+right)/2;
if(nums[mid]==target) return mid;
else if(nums[mid]<target)
{
left=mid+1;
}
else{
right=mid-1;
}
}
return -1;
}
}