c++实现---数字在排序数组中出现的次数

题目描述
统计一个数字在排序数组中出现的次数。
方法一:暴力方法
查找数组中某个目标,不管数组是否有序,直接遍历一遍即可。
代码:

class Solution {
public:
    int GetNumberOfK(vector<int> nums ,int k) {
        int ret = 0;
        for (int val : nums) {
            if (val == k) 
                ++ret;
        }
        return ret;
    }
};

时间复杂度:O(N)
空间复杂度:O(1)
方法二:二分查找
代码为:

class Solution {
public:
    //在排序序列中使用二分查找法可以将时间复杂度优化到O(log N));
    int GetNumberOfK(vector<int> data ,int k) {
        int lbound=0,rbound=0;
        int l=0,r=data.size();
        while(l<r){
            int mid=l+((r-l)>>1);
            if(data[mid]<k){
                l=mid+1;//找到目标数字的下界,即目标值的第一个,如果目标值不存在,则是第一个比它大的
            }else{
                r=mid;
            }
        }
        lbound=l;
        l=0,r=data.size();
        while(l<r){
            int mid=l+((r-l)>>1);
            if(data[mid]<=k){
                l=mid+1;//找到第一个比目标值大的上界
            }else{
                r=mid;
            }
        }
        rbound=r;
        return rbound-lbound;//上界减去下界即为该数字出现的次数
    }
};

我们也可以直接用STL中的upper_bound(), lower_bound()库函数
代码如下:

class Solution {
public:
    //最简洁的方法是使用STL自带的求上下界的库函数
    int GetNumberOfK(vector<int> data ,int k) {
        return upper_bound(data.begin(),data.end(),k)-lower_bound(data.begin(),data.end(),k);
    }
};

时间复杂度:O(logN)
空间复杂度:O(1)

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值