难度中等2262
给你一个按照非递减顺序排列的整数数组 nums
,和一个目标值 target
。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target
,返回 [-1, -1]
。
你必须设计并实现时间复杂度为 O(log n)
的算法解决此问题。
思路:看了眼时间复杂度,肯定不能直接遍历数组,又看到是有序的数组,首先想到了二分查找,之后的思路是二分找到数字所在的位置,之后让两个指针同时指向这个位置,一个向前一个向后移动,找到满足条件的第一个和最后一个。
代码:
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] res={-1,-1};
if(nums.length==0)
{
return res;
}
int a=-1;
int b=-1;
//先找到这个元素
int left=0;
int right=nums.length-1;
while(left<=right)
{
int mid=left+(right-left)/2;
if(nums[mid]==target)
{
a=mid;
b=mid;
break;
}
else if(nums[mid]>target) right=mid-1;
else left=mid+1;
}
//假如存在
if(a>=0 && b>=0)
{
while(nums[a]==target)
{
a--;
if(a<0) break;
}
a=a+1;
while(nums[b]==target && b>=0)
{
b++;
if(b>nums.length-1) break;
}
b=b-1;
}
res[0]=a;
res[1]=b;
return res;
}
}
小结:这题的思路我感觉不难,但是细节要反复改,有些重复的变量其实可以替换,但是有点小懒没做优化