我的解题:
1.先用二分查找找到target,在由该节点向左右遍历看有多少相等的
class Solution {
public:
int search(vector<int>& nums, int target) {
int i=0;
int j=nums.size()-1;
int count=0;
int mid;
while(i<=j){
mid=(i+j)/2;
if(nums[mid]==target){
count++;
break;
}
if(nums[mid]>target) j=mid-1;
else if(nums[mid]<target) i=mid+1;
}
if(count==0) return 0;
for(int tmp=mid+1;tmp<nums.size();tmp++){
if(nums[tmp]==target) count++;
}
for(int tmp=mid-1;tmp>=0;tmp--){
if(nums[tmp]==target) count++;
}
return count;
}
};
2.用两次二分查找
class Solution {
public:
int func(vector<int>nums,int n){
int i=0;
int j=nums.size()-1;
while(i<j){
int mid=(i+j)/2;
if(nums[mid]>=n) j=mid;
else i=mid+1;
}
return i;
}
int search(vector<int>& nums, int target) {
if(!nums.size()) return 0;
int i=func(nums,target);
int j=func(nums,target+1);
if(nums[j]==target) return j-i+1;
else return j-i;
}
};