题目 数字在升序数组中出现的次数
描述
统计一个数字在升序数组中出现的次数。
示例1
输入:
[1,2,3,3,3,3,4,5],3
返回值:
4
解
因为是有序数组,因此我采用二分查找的方法。
法一:
在数组中找到元素后,向左向右循环,获取出现次数。
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
//二分查找
int low = 0;
int high = data.size()-1;
int mid = 0;
int count = 0;
while(low <= high)
{
mid = (low+high)/2;
if(k > data[mid])
low = mid+1;
else if(k < data[mid])
high = mid - 1;
else
{
int t = mid;
while(t >= low && data[t] == k)
{
count++;
t--;
}
t = mid+1;
while(t<=high && data[t] == k)
{
count++;
t++;
}
break;
}
}
return count;
}
};
法二:
通过二分查找,采用递归找到k的第一个和最后一个位置,然后通过 last-first+1 返回个数。
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int len = data.size();
if(len == 0) return 0;
int first = getFirst(data, k, 0, len-1);
int last = getLast(data, k, 0, len-1);
if(first > -1 && last > -1)
return last - first+1;
return 0;
}
int getFirst(vector<int> &data , int k , int begin , int end)
{
if (begin > end)
{
return -1;
}
int mid = (begin+end)/2;
if(data[mid] == k && (mid == begin || data[mid-1] != k))
{
return mid;
}
else if(data[mid] >= k)
return getFirst(data, k, begin, mid-1);
else
return getFirst(data, k, mid+1, end);
}
int getLast(vector<int> &data , int k , int begin , int end)
{
if (begin > end)
{
return -1;
}
int mid = (begin+end)/2;
if(data[mid] == k && (mid == end || data[mid+1] != k))
{
return mid;
}
else if(data[mid] <= k)
return getLast(data, k, mid+1, end);
else
return getLast(data, k, begin, mid-1);
}
};