力扣35题
题目描述:在排序数组中查找元素的第一个和最后一个位置
给你一个按照非递减顺序排列的整数数组
nums
,和一个目标值target
。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值
target
,返回[-1, -1]
。你必须设计并实现时间复杂度为
O(log n)
的算法解决此问题。
题解思路:
target一共有三种情况:
- target比nums[0]小或者比nums[nums.length-1]大,在数组的两边的情况;
- 数组中没有target,也需要搜索后才知道;
- 数组中有target。
总结:可以先用二分查找找到一个下标,再寻找左右边界。
class Solution {
public int[] searchRange(int[] nums, int target) {
// 先用二分查找找到一个下标,再寻找左右边界
if (nums.length==0||target<nums[0]||target>nums[nums.length-1]){
return new int[]{-1,-1};
}
int index = binarySearch(nums,target);
if (index==-1){
return new int[]{-1,-1};
}
// 寻找左右边界
int left=index;
int right=index;
while (left-1>=0&&target==nums[left-1]){
left--;
}
while (right+1< nums.length&&target==nums[right+1]){
right++;
}
return new int[]{left,right};
}
// 没有找到 target就返回 -1
public int binarySearch(int[] nums,int target){
int left=0;
int right= nums.length-1;
int mid=0;
while (left<=right){
mid=(left+right)/2;
if (target>nums[mid]){
left=mid+1;
} else if (target < nums[mid]) {
right=mid-1;
}else {
return mid;
}
}
return -1;
}
}