题目描述
本题知识点: 数组 二分
解答
第一反应
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int count=0;
for(int i=0;i<data.size();i++){
if(data[i]==k)
count++;
if(data[i]>k)
break;
}
return count;
}
};
看了知识点
大家基本都是找到k出现的第一个位置,所以用了二分。
调试了很久,踩了两个坑,一个是二分的判断条件mid应该是(high+low)/2,还有一开始起始的high写错了。
和一般的二分不一样的就是等于k的情况,我这边用两次else if,其实可以合并但是为了清楚一点所以分开写了。
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int high = data.size()-1;
int low = 0;
int mid = (high+low)/2;;
int count=0;
while(high>=low){
if(data[mid]==k){
if(mid>0 && data[mid-1]==k){ //找到k并且k不是第一次出现
high = mid-1;
}
else if(mid == 0 && data[mid]==k)
break;
else if(mid>0 && data[mid-1]!=k)
break;
}
else if(data[mid]>k){
high = mid-1;
}
else{
low = mid+1;
}
mid = (high+low)/2;
}
for(;mid<data.size();mid++){
if(data[mid]!=k){
break;
}
count++;
}
return count;
}
};