因为有序
所以用二分法,分别找到第一个k和最后一个k的下标。时间O(logN)
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int num=0;
int size=data.size();
if(size>0){
int num1=getfk(data,0,size-1,k);
int num2=getsk(data,0,size-1,k);
if(num1!=-1 &&num2!=-1)
num=num2-num1+1;
}
return num;
}
int getfk(vector<int>&data,int l,int r,int k){
if(l>r)return -1;
int m=(l+r)>>1;
int m_val=data[m];
if(m_val>k)
r=m-1;
else if(m_val<k)
l=m+1;
else{
if((m>0 && data[m-1]!=k)|| m==0)
return m;
else
r=m-1;
}
return getfk(data,l,r,k);
}
int getsk(vector<int>&data,int l,int r,int k){
if(l>r)return -1;
int m=(l+r)>>1;
int m_val=data[m];
if(m_val>k)
r=m-1;
else if(m_val<k)
l=m+1;
else{
if((m<data.size()-1 && data[m+1]!=k)|| m==data.size()-1)
return m;
else
l=m+1;
}
return getsk(data,l,r,k);
}
};
时间: 2024-10-29 10:46:15