题目描述
统计一个数字在排序数组中出现的次数。
方法一:
二分查找找到第一个k和最后一个k出现的位置,相减得到次数。
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int high,low,mid;
low=0;
high=data.size()-1;
int left=-1,right=-1;
while(low<=high)
{//如果mid等于k,向后找是否还有k,如果小于k,则向后找,如果大于k则向前找
mid=low+(high-low)/2;
if (data[mid]>k)
{
high=mid-1;
}
else if (data[mid]<k)
{
low=mid+1;
}
else
{
left=mid;
high=mid-1;
}
}
if(left==-1){
return 0;
}
low=0;
high=data.size()-1;
while(low<=high)
{//如果mid等于k,向后找是否还有k,如果小于k,则向后找,如果大于k则向前找
mid=low+(high-low)/2;
if (data[mid]<=k){
low=mid+1;
}
else
{
right=mid;
high=mid-1;
}
}
if(data[mid]==k&&mid==data.size()-1){
right=mid+1;
}
return right-left;
}
};
方法二:
二分查找到k的位置后,向前向后遍历找到第一个和最后一个值。
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int high,low,mid,i,j;
low=0;
high=data.size()-1;
int index=-1,count=0;
while(low<=high)
{//如果mid等于k,向后找是否还有k,如果小于k,则向后找,如果大于k则向前找
mid=low+(high-low)/2;
if (data[mid]>k)
{
high=mid-1;
}
else if (data[mid]<k)
{
low=mid+1;
}
else
{
break;
}
}
if(low<=high)
{
for(i=mid;i>=0;i--){
if(data[i]==k){
count++;
}
else{break;}
}
for(i=mid+1;i<data.size();i++){
if(data[i]==k){
count++;
}
else{break;}
}
}
return count;
}
};