-
题目描述
统计一个数字在排序数组总出现的次数。
-
思路
最直观的方法就是顺序扫描,时间复杂度为O(n)。可以使用二分查找,分别找出排序数组中第一个该数的下标和最后一个该数的下标,然后就可得到数字的出现次数。而二分查找的时间复杂度为O(logn)。
-
C++实现
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int size = data.size();
if(size==0)return 0;
int firstK = getFirstK(data,k,0,size-1);
int lastK = getLastK(data,k,0,size-1);
if(firstK!=-1&&lastK!=-1)
return lastK - firstK + 1;
return 0;
}
//返回data[low...high]中第一个k的下标,如果未找到则返回-1
int getFirstK(vector<int> data, int k, int low, int high){
if(low>high)return -1;
int mid = (high+low)/2;
if(data[mid] > k){
return getFirstK(data, k, low, mid-1);
}else if(data[mid] < k){
return getFirstK(data, k, mid+1, high);
}else if(mid-1>=low&&data[mid-1]==k){
return getFirstK(data, k, low, mid-1);
}else
return mid;
return -1;
}
//返回data[low...high]中最后一个k的下标,如果未找到则返回-1
int getLastK(vector<int> data, int k, int low, int high){
if(low>high)return -1;
int mid = (high+low)/2;
while(low<=high){
if(data[mid]>k)
high = mid-1;
else if(data[mid]<k)
low = mid+1;
else if(mid+1<data.size()&&data[mid+1]==k)
low = mid+1;
else
return mid;
mid = (high+low)/2;
}
return -1;
}
};