您的位置:首页 > Web前端

剑指offer 数字在排序数组中出现的次数

2016-03-16 20:31 357 查看
因为有序所以用二分法,分别找到第一个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);

}

};

[/code]

来自为知笔记(Wiz)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: