leetcode34在排序数组中查找元素的第一个和最后一个位置
要求:在排序数组中查找元素的第一个和最后一个位置
时间复杂度:olg(n)
解法:这个题可以用二分搜索来做,分别搜索出最左边的元素和最右边的元素
//在排序数组中查找元素的第一个位置和最后一个位置
public static int[] searchRange(int[] nums, int target) {
int[] result = new int[]{-1,-1};
if(null==nums||nums.length==0)return result;
result[0]=searchLeft(nums,target);
result[1]=searchRight(nums,target);
return result;
}
// 1 2 2 2 3 寻找2的左侧边界下标1
public static int searchLeft(int[] nums,int target){
if(null==nums||nums.length==0)return -1;
int low=0,high=nums.length-1;
while(low<=high){
int mid = (low+high)>>>1;
if(nums[mid]==target){
if(mid==0||nums[mid-1]!=target){
return mid;
}else if(nums[mid-1]==target) {
high = mid-1;
}
}else if(target>nums[mid]){
low = mid+1;
}else if(target<nums[mid]){
high = mid-1;
}
}
return -1;
}
public static int searchRight(int[] nums,int target){
if(null==nums||nums.length==0)return -1;
int low=0,high=nums.length-1;
while(low<=high){
int mid = (low+high)>>>1;
if(nums[mid]==target){
if(mid==nums.length-1||nums[mid+1]!=target){
return mid;
}else if(nums[mid+1]==target) {
low = mid+1;
}
}else if(target>nums[mid]){
low = mid+1;
}else if(target<nums[mid]){
high = mid-1;
}
}
return -1;
}