数字在排序数组中出现的次数
题目描述
统计一个数字在排序数组中出现的次数。
解题思路
- 直接遍历一遍的话,O(N)的复杂度
- 不需要一个一个数,因为是排序数组,找到第一个k的位置、最后一个k的位置,做差就能得到k出现的次数,但是二分只能找到一个随机的k,怎么定位第一个和最后一个k?
- 上述可以转为求第一个小于k的位置、第一个大于k的位置,但是这两个数也有可能不止一个,又会出现重复的问题
- 转为求k-0.5和,k+0.5的位置,然后做差即可
- 以1,3,4,4,4,7,8,9为例,统计4出现次数。模拟一遍查找过程,最后找到的是2和5,即第一个4的位置和最后一个4的后一个位置,做差就是4出现的次数
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
return binsearch(data,k+0.5)-binsearch(data,k-0.5);
}
int binsearch(const vector<int> &data,double k){
int i=0,j=data.size()-1;
while(i<=j){
int mid=(i+j)>>1;
if(data[mid]>k){
j=mid-1;
}else if(data[mid]<k)
i=mid+1;
}
return i;
}
};