在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
思路+代码+注释:
class Solution {
public int[] searchRange(int[] nums, int target) {
/*
思路:使用二分查找,查找到值等于target的元素后,如果该元素大于前面的数那么该元素就是起始位置,否则起始位置在该元素左边
如果该元素小于后面的数那么该元素就是终止位置
*/
int startIndex=-1;
int endIndex=-1;
int low=0;
int high=nums.length-1;
while (low<=high)
{
int mid=(low+high)/2;
if (nums[mid]==target)
{
//mid等于0是第一个元素肯定是起始位置
if (mid==0 || nums[mid]>nums[mid-1])
{
//找到起始位置
startIndex=mid;
break;
}else {
//mid前还有相等的元素,startIndex应该在左边
high=mid-1;
}
}else if (nums[mid]<target)
{
low=mid+1;
}else {
high=mid-1;
}
}
low=0;
high=nums.length-1;
while (low<=high)
{
int mid=(low+high)/2;
if (nums[mid]==target)
{
//mid是最后一个元素肯定是终止位置
if (mid==nums.length-1 || nums[mid]<nums[mid+1])
{
//找到终止位置
endIndex=mid;
break;
}else {
//mid后还有相等的元素,endIndex应该在右边
low=mid+1;
}
}else if (nums[mid]<target)
{
low=mid+1;
}else {
high=mid-1;
}
}
return new int[]{startIndex,endIndex};
}
}