class Solution {
// 二分法,两次二分,分别找到左右边界(第一个小于的数和第一个大于的数,相减在减一)
// 或者找target和target-1的右边界,一个函数复用两次。
public int search(int[] nums, int target) {
if(nums.length==0||target<nums[0]||target>nums[nums.length-1]){
return 0;
}
int l=0,r=nums.length-1;
// 寻找右边界
while(l<=r){
int n=(l+r)/2;
if(nums[n]<=target){
l=n+1;
}else{
r=n-1;
}
}
int right=l;
if(r>=0&&nums[r]!=target){
return 0;
}
// 寻找左边界
l=0;
r=nums.length-1;
while(l<=r){
int n=(l+r)/2;
if(nums[n]>=target){
r=n-1;
}else{
l=n+1;
}
}
int left=r;
return right-left-1;
}
}