解法一 O(nlogn) + O(n)
class Solution {
public:
vector<int> searchRange(vector<int> &A, int target) {
// lower index
if(A.empty()) return {-1,-1};
int n = A.size();
int l=0, r=n-1;
while(l<r){
int mid = l+(r-l)/2;
if(A[mid]<target) l=mid+1;
else r=mid;
}
if(A[r]!=target) return {-1, -1};
// upper index
int i=r;
while(i<n){
if(A[++i]!=target) break;
}
return {r, i-1};
}
};
解法二 O(nlogn) + O(nlogn)
结尾处如何避免check是否超出边界
Looking for lower bound(>=target): 用左闭右闭,这样结尾处只需要check nums[r]!=target
Looking for upper bound(>target): 用左闭右开,这样结尾处只需要check nums[r-1]!=target
class Solution {
public:
vector<int> searchRange(vector<int> &A, int target) {
// lower index
if(A.empty()) return {-1,-1};
int n = A.size();
int l=0, r=n-1;
while(l<r){
int mid = l+(r-l)/2;
if(A[mid]<target) l=mid+1;
else r=mid;
}
if(A[r]!=target) return {-1, -1};
// upper index
l=r;
int r2=n;
while(l<r2){
int mid = l+(r2-l)/2;
if(A[mid]<=target) l=mid+1;
else r2=mid;
}
return {r, r2-1};
}
};