【数组算法题】统计某个数字在升序数组中出现的次数

统计某个数字在升序数组中出现的次数

题目:给定一个长度为 n的非降序数组和一个非负数整数 k,要求统计 k在数组中出现的次数
数据范围:
**要求:**空间复杂度为O(1) ,时间复杂度 log(n)
示例1
输入
[1,2,3,3,3,3,4,5], 3
返回值:4
解题思路:
1.不考虑时间复杂度时,可以用暴力求解——遍历一遍,然后相等则加1.
2.题目中需要考虑时间复杂度,且提示该数组是一个升序数组。——采用二分法求解。

实现1:

class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        int i;
        int count = 0;
        int len = data.size();
        if((k > 100) || (len > 1000) || k > data[len-1] || len == 0) //注意几种wuxioa
        {
            return 0;
        }
        else
        {
            for(i = 0; i < len; i++)
            {
                if(k == data[i])
                {
                    count++;
                }
            }
            return count;
        }
    }
};

实现2:

class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        int mid,left,right;
        int count = 0;
        int len = data.size();
        left = 0;
        right = len -1;
        mid = 0;
        //不符合题意的场景
        if((k > 100) || (len > 1000) || k > data[len-1] || len == 0)
        {
            return 0;
        }
        //k值必然出现1次,可以先找到与k值相等的界限作为二分法的mid值。
        while(left <= right)
        {
            mid = (left + right) /2;
            if(k > data[mid])
            {
                left = mid + 1;
            }
            else if(k < data[mid])
            {
                right = mid - 1;
            }
            else
            {
                count++;
                break;
            }
        }
        //找到的中间值mid刚好与k值相等,count此时为1,确定left和right值,分2次对左右两边的值进行遍历。
        left = mid - 1;
        right = mid + 1;
        while(left >= 0 && data[left] == k)
        {
            count++;
            left--;
        }
        while(right <= len && data[right] == k)
        {
            count++;
            right++;
        }
        return count;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值