题目描述
统计一个数字在排序数组中出现的次数
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
}
};
//因为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);
}
int biSearch(vector<int> &data, double num)
{
int start = 0, end = data.size()-1;
while(start <= end)
{
int mid = (end-start)/2 + start;
if(data[mid] > num )
{
end = mid-1;
}
else
{
start = mid+1;
}
}
return start;
}
};
因为是有序数组,所以可以用二分查找。
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int length = data.size();
if(length == 0)
return 0;
int firstK = getFirstK(data, k, 0, length-1);
int lastK = getLastK(data, k, 0, length-1);
if(firstK != -1 && lastK != -1)
{
return lastK - firstK +1;
}
return 0;
}
int getFirstK(vector<int> &data, int k, int start, int end) //循环写法
{
while(start <= end)
{
int mid = (start+end)/2;
if( k < data[mid])
end = mid-1;
else if(k> data[mid])
start = mid+1;
else if(mid-1>=0 && data[mid-1] == k)
end = mid-1;
else
return mid;
}
return -1;
}
int getLastK(vector<int> &data, int k, int start, int end) //循环写法
{
while(start <= end)
{
int mid = (start + end)/2;
if(k<data[mid])
end = mid-1;
else if(k>data[mid])
start = mid +1;
else if(mid+1<data.size() && data[mid+1] == k)
start = mid + 1;
else
return mid;
}
return -1;
}
};