剑指offer 编程题(36):数字在排序数组中出现的次数

题目描述
统计一个数字在排序数组中出现的次数。

可以按统计字符的方法
与剑指offer 编程题(27):数组中出现次数统计解题思路和方法一样
http://blog.csdn.net/coolwriter/article/details/78867632

剑指offer 编程题(33):第一个只出现一次的字符
http://blog.csdn.net/coolwriter/article/details/78880874

class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        if(data.size() <= 0)
        {
            return 0;
        }
        map<int, int> m;
        for(int i =0;i < data.size();i++)
        {
            ++m[data[i]];
        }
        return m[k];
    }
};
class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
      //单纯的利用了count函数。。。。。
        return count(data.begin(),data.end(),k);
    }
};

equal_range是C++ STL中的一种二分查找的算法,试图在已排序的[first,last)中寻找value,它返回一对迭代器i和j,其中i是在不破坏次序的前提下,value可插入的第一个位置(亦即lower_bound),j则是在不破坏次序的前提下,value可插入的最后一个位置(亦即upper_bound),因此,[i,j)内的每个元素都等同于value,而且[i,j)是[first,last)之中符合此一性质的最大子区间
如果以稍许不同的角度来思考equal_range,我们可把它想成是[first,last)内”与value等同”之所有元素形成的区间A,由于[fist,last)有序(sorted),所以我们知道”与value等同”之所有元素一定都相邻,于是,算法lower_bound返回区间A的第一个迭代器,算法upper_bound返回区间A的最后一个元素的下一个位置,算法equal_range则是以pair的形式将两者都返回
即使[fist,last)并未含有”与value等同”之任何元素,以上叙述仍然合理,这种情况下,”与value等同”之所有元素形成的,其实是一个空区间,在不破坏次序的情况下,只有一个位置可以插入value,而equal_range所返回的pair,其第一和第二(都是迭代器)皆指向该位置。

class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
    //二分查找
        auto resultPair = equal_range(data.begin(), data.end(),k);
        return resultPair.second - resultPair.first;
    }
};

lower_bound(应用于有序区间)

这是二分查找(binary search)的一种版本,试图在已排序的[first,last)中寻找元素value:
如果[first,last)具有与value相等的元素(s),便返回一个迭代器,指向其中第一个元素;
如果没有这样的元素存在,便返回“假设这样的元素存在时应该出现的位置”,也就是说,它返回一个迭代器,指向第一个“不小于value”的元素;
如果value大于{first,last)内的任何一个元素,则返回last。

另外一种理解,其返回值是“在不破坏排序状态的原则下,可插入value的第一个位置”。

upper_bound (应用于有序区间)

算法upper_bound是二分查找(binary search)法的一个版本。它视图在已排序的[first,last)中寻找value。更明确地说,它会返回“在不破坏顺序的情况下,可插入value的最后一个合适的位置”。

由于STL规范“区间圈定”时的起头和结尾并不对称(是的,[first,last)包含first但不包含last),所以upper_bound与lower_bound的返回值意义大有不同。如果你查找某值,而它的确出现在区间之内,
则lower_bound返回的是一个指向该元素的迭代器。然而upper_bound不这么做,因为upper_bound所返回的是在不破坏排序状态的情况下,value可被插入“最后一个”合适位置。如果value存在,那么它返回的迭代器将指向value的下一位置,而非指向value本身。
这里写图片描述


class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        auto left = lower_bound(data.begin(), data.end(), k);
        auto right = upper_bound(data.begin(), data.end(), k);
        return right - left;
    }
};
class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        if(data.size()==0)
            return 0;
        int i=0;
        for(;i<data.size();i++)
            {
            if(data[i]==k)
                break;
        }
        int length=data.size();
        int j=length-1;
        for(;j>=i;j--)
            {
            if(data[j]==k)
                break;
        }
        return (j-i+1);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值