题目描述
统计一个数字在排序数组中出现的次数。
思路:直接遍历
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int count = 0;
for(int i = 0;i<data.size();)
{
if(data[i]==k)
{
int j = i;
while(j<data.size()&&data[j]==data[i])
{
count++;
j++;
}
break;
}
else i++;
}
return count;
}
};
但一般不是考这个,一般是考二分查找,毕竟是O(longn)复杂度
class Solution {
public:
int pose(vector<int> data,double s)
{
int l = 0,r=data.size()-1;
while(l<=r)
{
int mid = (r-l)/2+l;
if(data[mid]<s)
{
l = mid + 1;
}
else if(data[mid]>s)
{
r = mid - 1;
}
}
return l;
}
int GetNumberOfK(vector<int> data ,int k) {
return pose(data,k+0.5)-pose(data,k-0.5);
}
};
二分查找博大精深
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int lower = getLower(data,k);
int upper = getUpper(data,k);
return upper - lower + 1;
}
//获取k第一次出现的下标
int getLower(vector<int> data,int k){
int start = 0,end = data.size()-1;
int mid = (start + end)/2;
while(start <= end){
if(data[mid] < k){//
start = mid + 1;
}else{
end = mid - 1;
}
mid = (start + end)/2;
}
return start;
}
//获取k最后一次出现的下标
int getUpper(vector<int> data,int k){
int start = 0,end = data.size()-1;
int mid = (start + end)/2;
while(start <= end){
if(data[mid] <= k){
start = mid + 1;
}else{
end = mid - 1;
}
mid = (start + end)/2;
}
return end;
}
};