题目描述
统计一个数字在排序数组中出现的次数
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int low = 0,high = data.size()-1;
int mid = low + (high-low)/2;
while(low <= high)
{
if(data[mid] == k)
break;
else
{
if(data[mid] < k)
low = mid + 1;
else
high = mid - 1;
mid = low + (high-low)/2;
}
} // 二分找到K的某一位置
int sum = 0;
int posLeft = mid, posRight = mid + 1;
while (posLeft > -1 && posLeft < data.size()&&data[posLeft] == k)
{
sum++;
posLeft--;
} //左侧搜索
while (posRight < data.size() && data[posRight] == k)
{
sum++;
posRight++;
} //右侧搜索
return sum;
}
};
转一有效解:
//链接:https://www.nowcoder.com/questionTerminal/70610bf967994b22bb1c26f9ae901fa2
//来源:牛客网
//因为data中都是整数,所以可以稍微变一下,不是搜索k的两个位置,而是搜索k-0.5和k+0.5
//这两个数应该插入的位置,然后相减即可。
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
return biSearch(data, k+0.5) - biSearch(data, k-0.5) ;
}
private:
int biSearch(const vector<int> & data, double num){
int s = 0, e = data.size()-1;
while(s <= e){
int mid = (e - s)/2 + s;
if(data[mid] < num)
s = mid + 1;
else if(data[mid] > num)
e = mid - 1;
}
return s;
}
};