排序数组中查找元素的第一个和最后一个位置 Find First And Last Position of Element in Sorted Array
给定一个非递减排序数组nums
和目标target
.找到target在数组中的开始位置和结束位置。如果数组中不存在这个数,返回[-1,-1]
nums = [5,7,7,8,8,10], target = 7
[1,2]
思路
这个要求,查到target的第一个位置和最后一个位置。
如何查第一个位置?
因为是有序的,可以通过二分查找来定位。
如何查找最后一个位置?
因为是有序的,在二分查找中,设定l,r逼近目标mid,返回最后一个位置。
public int[] searchRange(int[] nums, int target) {
int[] ans = new int[]{-1,-1};
int pos = 0;
int first = searchfirst01(nums,pos, target);
if(first==nums.length||nums[first]!=target){
return ans;
}
pos = first;
int last = searchfirst01(nums, pos,target+1)-1;
ans[0] = first;
ans[1] = last;
return ans;
}
public int searchfirst01(int[] arr,int pos, int target){
if(arr.length==0){
return -1;
}
int l = pos ;
int r = arr.length-1;
int mid = 0;
while (r-l>3){
mid = (l+r)>>1;
if(arr[mid]>=target){
r = mid;
}
else{
l =mid+1;
}
}
for (int i = l; i <=r ; i++) {
if (arr[i]>=target){
return i;
}
}
return arr.length;
}
searchfirst01 用来寻找数组中满足 x>=target的第一个位置,如果是target==7,就返回第一个位置;要想定位最后一个位置,就尝试寻找第一个x>=8的位置,然后-1;如果找不到满足条件的位置,就返回数组长度
Tag
math
binary search