题目描述
统计一个数字在排序数组中出现的次数。
分析:排序数组找数字,当然想到用二分,用两次二分,分别找到第一个k和最后一个k,计算两者位置的差值返回。要注意数组中不包含这个数字的情况。
代码:
class Solution {
public:
int GetFirstk(vector<int> data,int k,int low,int high){
while(low<high){
int mid=low+(high-low)/2;
if(data[mid]==k){
if(data[mid-1]!=k){
return mid;
}
high=mid-1;
}
else if(data[mid]>k){
high=mid-1;
}else{
low=mid+1;
}
}
if(low>=high&&data[low]==k) return low;
return -1;
}
int GetLastk(vector<int> data,int k,int low,int high){
while(low<high){
int mid=low+(high-low)/2;
if(data[mid]==k){
if(data[mid+1]!=k){
return mid;
}
low=mid+1;
}
else if(data[mid]>k){
high=mid-1;
}
else{
low=mid+1;
}
}
if(low>=high&&data[low]==k) return low;
return -1;
}
int GetNumberOfK(vector<int> data ,int k) {
int n=data.size();
if(n==0||k<data[0]||k>data[n-1]) return 0;
int first=GetFirstk(data,k,0,n-1);
int last=GetLastk(data,k,0,n-1);
if(last!=-1&&first!=-1) return last-first+1;
else return 0;
}
};