统计一个数字在升序数组中出现的次数。
方法一:简单不精致,面试官不满意
思路:排序数组就用二分法找到数字K,再遍历其左右统计次数即可。
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
if (data.empty())
return 0;
int low = 0, high = data.size() - 1,mid=0;
while (low < high)
{
mid = low + (high - low) / 2;
if (data[mid] > k)
high = mid - 1;
else if (data[mid] < k)
low = mid + 1;
else
{
break;
}
}
int count = 0;
if (data[mid] == k)
{
int i = mid, j = mid + 1;
while (i>=0&&data[i]==k)
{
++count;
--i;
}
while (j<data.size()&& data[j] == k)
{
++count;
++j;
}
}
return count;
}
};方法2:递归
用二分查找直接找出第一个K和最后一个K
class Solution {
public:
int GetFirstK(vector<int> data, int k,int start,int end)
{
if (start > end)
return -1;
int low = start, high = end, mid = low + (high - low) / 2;
if (data[mid] == k)
{
if (mid != 0 && data[mid - 1] == k)
high = mid - 1;
else
return mid;
}
else if (data[mid] > k)
high = mid - 1;
else
low = mid + 1;
return GetFirstK(data, k, low, high);
}
int GetLastK(vector<int> data, int k, int start, int end)
{
if (start > end)
return -1;
int low = start, high = end, mid = low + (high - low) / 2;
if (data[mid] == k)
{
if (mid != end && data[mid + 1] == k)
low = mid + 1;
else
return mid;
}
else if (data[mid] > k)
high = mid - 1;
else
low = mid + 1;
return GetLastK(data, k, low, high);
}
int GetNumberOfK(vector<int> data, int k) {
if (data.empty())
return 0;
int start = 0, end = data.size() - 1;
int FirstK = GetFirstK(data, k, start, end);
if (FirstK < 0)
return 0;
int LastK=GetLastK(data,k,start,end);
//cout << FirstK << " " << LastK << endl;
return LastK - FirstK + 1;
}
};
京公网安备 11010502036488号