// 解法一:寻找目标值的左右边界
class Solution {
public:
int leftBound(vector<int>& nums, int target){
int left=0,right=nums.size()-1;
while(left<=right){
int mid=left+(right-left)/2;
if(nums[mid]==target){
right=mid-1;
}
else if(nums[mid]>target){
right=mid-1;
}
else if(nums[mid]<target){
left=mid+1;
}
}
if(left>=nums.size() || nums[left]!=target)
return -1;
return left;
}
int rightBound(vector<int>& nums, int target){
int left=0,right=nums.size()-1;
while(left<=right){
int mid=left+(right-left)/2;
if(nums[mid]==target){
left=mid+1;
}
else if(nums[mid]>target){
right=mid-1;
}
else if(nums[mid]<target){
left=mid+1;
}
}
if(right<0 || nums[right]!=target)
return -1;
return right;
}
int search(vector<int>& nums, int target) {
int left=-1, right=-1;
left=leftBound(nums, target);
right=rightBound(nums, target);
if(left==-1 && right==-1)
return 0;
return (right-left+1);
}
};
// 解法二:左边界不变,右边界求出第一个比目标值大的数的下标
class Solution {
public:
int search(vector<int>& nums, int target) {
int i=lowerbound(nums,target);
int j=lowerbound(nums,target+1);
return j-i;
}
int lowerbound(vector<int>& nums,int target){
int left=0,right=nums.size()-1;
while(left<=right){
int mid=left+(right-left)/2;
if(nums[mid]>=target)
right=mid-1;
else
left=mid+1;
}
return left;
}
};