题目:
统计一个数字在排序数组中出现的次数
思路:
因为是排序数组,所以重复的数字都连着排列,因此只需要找到第一个出现的位置和最后一次出现的位置即可,可用二分法实现,复杂度为O(logn)
代码实现:
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int len = data.size();
int result = 0;
if(len > 0)
{
int first = Getfirst(data, k, 0, len - 1);
int last = Getlast(data, k, len, 0, len - 1);
if(first > -1 && last > -1)
result = last - first + 1;
}
return result;
}
/*---查找第一个k出现的位置---*/
int Getfirst(vector<int> data, int k, int start, int end)
{
if(start > end)
return -1; // 如果没有则返回-1
int mid = (start + end) / 2;
if(data[mid] == k)
{
if((mid > 0 && data[mid - 1] != k) || mid == 0)
return mid; // 如果当前时最左边的元素或者其左边的元素不是k则表明该位置为k首次出现的位置
else
end = mid - 1;
}
else if(data[mid] < k)
start = mid + 1;
else
end = mid - 1;
return Getfirst(data, k, start, end);
}
/*---查找最后一个k出现的位置---*/
int Getlast(vector<int> data, int k, int len, int start, int end)
{
if(start > end)
return -1;
int mid = (start + end) / 2;
if(data[mid] == k)
{
if((mid < len - 1 && data[mid + 1] != k) || mid == len - 1)
return mid;
else
start = mid + 1;
}
else if(data[mid] < k)
start = mid + 1;
else
end = mid - 1;
return Getlast(data, k, len, start, end);
}
};