统计一个数字在排序数组中出现的次数
排序数组中查找常用二分法查找,为了寻找出现次数,稍微改动二分法查找,找到目标数字第一次出现位置以及最后一次出现位置即可。
代码如下:
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int first,last;
int number=0;
if(data.size()==0) return 0;
first=findfirst(data,0,data.size()-1,k);
last=findlast(data,0,data.size()-1,k);
if(first>-1 && last>-1)
number = last - first +1;
return number;
}
int findfirst(vector<int> data,int left,int right,int k){
int mid;
if(left<=right){
mid=(right-left)/2+left;
if(data[mid]>k) right=mid-1; //常规二分查找
else if(data[mid]<k) left=mid+1;
else{
if(mid > 0 &&data[mid-1]!=k || mid==left) return mid; //如果找到目标数字,且他之前不是自己或者这已经是第一个数字了,则可以确定这是第一个出现的目标数字
else right=mid-1; //否则继续向前查找
}
}
else return -1; //防止不存在目标数字
return findfirst(data,left,right,k);
}
int findlast(vector<int> data,int left,int right,int k){
int mid;
if(left<=right){
mid=(right-left)/2+left;
if(data[mid]>k) right=mid-1;
else if(data[mid]<k) left=mid+1;
else{
if(mid > 0 &&data[mid+1]!=k || mid==right) return mid; //同理,这是最后一个目标数字
else left=mid+1; //否则继续向后查找
}
}
else return -1;
return findlast(data,left,right,k);
}
};