统计一个数字在排序数组中出现的次数。
解题思路:
利用二分查找:
(感觉自己能写出二分查找了,嘻嘻)
错误点;
if(mid+1<n&&nums[mid+1]!=target||mid==n-1){
这个或条件没写出来,两种情况可以直接返回:
1.如果当前元素的下一个元素的值不等于Target,那么说明当前元素为后边界
2.如果当前元素为最后一个元素,那么当前元素为后边界。
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size();
if(n==0) return 0;
int first = getFirst(nums,target);
if(first==-1) return 0;
int last = getLast(nums,target);
return last-first+1;
}
int getFirst(vector<int>& nums,int target){
int n=nums.size();
int left=0,right=n;
while(left<right){
int mid = left+(right-left)/2;
if(nums[mid]==target){
if(mid-1>=0&&nums[mid-1]!=target||mid==0)
return mid;
else{
right = mid;
}
}else if(nums[mid]<target){
left = mid+1;
}else if(nums[mid]>target){
right = mid;
}
}
return -1;
}
int getLast(vector<int>& nums,int target){
int n = nums.size();
int left=0,right=n;
while(left<right){
int mid = left+(right-left)/2;
if(nums[mid]==target){
if(mid+1<n&&nums[mid+1]!=target||mid==n-1){
return mid;
}else{
left = mid+1;
}
}else if(nums[mid]<target){
left = mid+1;
}else if(nums[mid]>target){
right = mid;
}
}
return -1;
}
};