剑指offer 数字在排序数组中出现的次数
因为有序
所以用二分法,分别找到第一个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;elser=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;elsel=m+1;}return getsk(data,l,r,k);}};
浙公网安备 33010602011771号