思路:先通过二分查找找到元素,再从该位置向左、向右找到边界并输出。
若数组的每个元素都为目标值,则时间复杂度会上升到O(n)。
解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:40.9 MB,击败了99.77% 的Java用户
(不知道为啥这样可以近似双百)
class Solution {
public int[] searchRange(int[] nums, int target) {
int len= nums.length;
//特判
if(len==0||(len==1&&target!=nums[0])){
return new int[]{-1,-1};
}
int l=0,r=len-1,mid=0;
boolean flag=false;//是否存在该元素
while(l<=r){
mid=(l+r)/2;
if(nums[mid]==target){
flag=true;
break;
}
else if(nums[mid]<target){
l=mid+1;
}
else{
r=mid-1;
}
}
if(flag){
//向左、向右查找
for(l=mid-1;l>=0&&nums[l]==target;l--);
for(r=mid+1;r<len&&nums[r]==target;r++);
int[] res=new int[2];
res[0]=l+1;
res[1]=r-1;
return res;
}
else{
return new int[]{-1,-1};
}
}
}