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

题目的意思很简单,统计一个有序数组中某个数出现的次数。这里联系一下两种二分写法。

第一种二分为返回数组中与key相同的第一个数。(例如 [1,2,2,2,3] key =2 返回的为1)。相对于传统的二分,要修改的地方在我们要保证a[mid] == key的时候,尝试想左边区间继续寻找,并让r=mid。代码如下:

int binSearchFirst(vector<int> a,int k)
{
    int l = 0;
    int r = a.size()-1;

    while(r-l > 1)
    {
       int mid = (l+r)>>1;
       if(a[mid] >= k) r = mid; //相等的时候,继续去左子区间找是否有合适的解
       else l = mid+1;
       //cout << "123" <<endl;
    }
    if(a[r] !=k && a[l] !=k) return -1;
    if(a[l] == k) return l; 
    return r;

}

第二种二分为找出key最后出现的位置。(例如[1,2,2,3,4] key =2 输出为2)。这里我们只需要保证a[mid] == key的时候,继续去右子区间看还有没有key代码如下:

int binSearchLast(vector<int>a ,int k)
{
    int l = 0;
    int r = a.size()-1;

    while(r-l >1)
    {
       int mid = (l+r)>> 1;
       if(a[mid] <=k ) l=mid;
       else r =mid-1;
    }
    if(a[l] != k && a[l]!= k) return -1;
    if(a[r] == k) return r;
    return l;
}

 

posted @ 2019-11-09 19:48  猪突猛进!!!  阅读(118)  评论(0编辑  收藏  举报