题目描述:统计一个数字在升序数组中出现的次数。
输入:
[1,2,3,3,3,3,4,5],3
返回值:
4
1. 分析
思路:
- 一个暴力直接的方法:遍历整个数组;
- 二分法:先用二分框架找到目标值,然后左右遍历,记录次数。
2. 用C++写出逻辑
// 暴力法
int GetNumberOfK(vector<int> data ,int k) {
int len = data.size();
if(len < 0) return -1;
int countOfK = 0;
for(int j = 0;j < len; j++){
if(data[j] == k){
countOfK++;
if(data[j + 1] != k)
break;
}
}
return countOfK;
}
// 二分法
int GetNumberOfK(vector<int> data ,int k) {
int n = data.size();
if(n == 0 || k < 0) return 0;
int res = 0;
int low = 0, high = n - 1;
while(low <= high){
int mid = low + (high - low) / 2;
if(data[mid] > k)
high = mid - 1;
else if(data[mid] < k)
low = mid + 1;
else{
int l = mid - 1, r = mid + 1;
while(l >= 0 && data[l--] == k) res++;
while(r <= n - 1 && data[r++] == k) res++;
return res + 1;
}
}
return 0;
}