题目:34. 在排序数组中查找元素的第一个和最后一个位置
思路:二分查找,但需注意数组为空的情况。
C++版本:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> v={-1,-1};
int n=nums.size();
if(n==0) return v;
int l=0,r=n-1;
while(l<r){
int mid=(l+r)/2;
if(nums[mid]<target) l=mid+1;
else r=mid;
}
//如果没有预判数组为空,r=-1,l=0,空指针
if(nums[l]!=target) return v;
v[0]=l;
l=0,r=n-1;
while(l<r){
int mid=(l+r+1)/2;
if(nums[mid]<=target) l=mid;
else r=mid-1;
}
v[1]=l;
return v;
}
};
JAVA版本:
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] v=new int[]{-1,-1};
int n=nums.length;
if(n==0) return v;
int l=0,r=n-1;
while(l<r){
int mid=(l+r)/2;
//cout<<l<<"-"<<r<<"-"<<mid<<":"<<nums[mid]<<endl;
if(nums[mid]<target) l=mid+1;
else r=mid;
}
if(nums[l]!=target) return v;
v[0]=l;
l=0;
r=n-1;
while(l<r){
int mid=(l+r+1)/2;
if(nums[mid]<=target) l=mid;
else r=mid-1;
}
v[1]=l;
return v;
}
}