一、题目
统计一个数字在排序数组中出现的次数,例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4.
二、解法
思路:既然输入的数组是排序的,那么我们自然能想到用二分查找算法,如何高效的利用二分查找,可以分别利用二分查找找到第一个k和最后一个k。
#include <iostream>
#include <vector>
using namespace std;
int findLeftVal(const vector<int> &vec,int start,int end,int key){
if(start > end)
return -1;
int mid = (start + end)/2;
if(vec[mid] == key){
if(mid == 0 || vec[mid-1] != key)
return mid;
else
end = mid - 1;
}else if(vec[mid] > key)
end = mid-1;
else
start = mid+1;
return findLeftVal(vec,start,end,key);
}
int findRightVal(const vector<int> &vec,int start,int end,int key){
if(start > end)
return -1;
int mid = (start + end)/2;
if(vec[mid] == key){
if(mid == end || vec[mid+1] != key)
return mid;
else
start = mid + 1;
}else if(vec[mid] > key)
end = mid - 1;
else
start = mid + 1;
return findRightVal(vec,start,end,key);
}
int getNum(const vector<int> &vec,int key){
if(vec.size() == 0)
return 0;
int left = findLeftVal(vec,0,vec.size()-1,key);
int right = findRightVal(vec,0,vec.size()-1,key);
if(left > -1 && right > -1)
return right - left + 1;
else
return 0;
}
int main(){
vector<int> vec{1,2,3,3,3,3,4,5};
cout<<getNum(vec,3)<<endl;
}