剑指offer-刷题笔记-简单题-JZ53 数字在升序数组中出现的次数

该博客主要介绍了两种方法来解决《剑指Offer》中的一道问题——在升序数组中查找数字出现的次数。版本1采用顺序查找,遍历数组直到找到目标数字并计数;版本2则使用二分查找优化,先分别找到目标数字的上界和下界,然后返回它们的差值作为出现次数。这种方法提高了查找效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

剑指offer-刷题笔记-简单题-JZ53 数字在升序数组中出现的次数

版本1-顺序查找

class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        if(data.size() == 0 || k > data[data.size()-1] || k < data[0])
        {
            return 0;
        }
        
//         int low,high,mid;
//         low = 0;
//         high = data.size()-1;
//         mid = (low + high)/2;
        int count = 0;
        
//         if(k > data[data.size()-1] || k < data[0])
//         {
//             return 0;
//         }
        
        for(int i = 0;i<data.size();i++)
        {
            if(data[i] == k)
            {
            	//顺序表,开始找到的是第一个,从这个位置开始直到重复值结束
                while(data[i+count] == k)
                {
                    count += 1;
                }
                break;
            }
//             else if(data[mid] < k)
//             {
//                 low = mid + 1;
//             }
//             else
//             {
//                 high = mid - 1;
//             }
        }
        return count;
    }
};

版本2-二分查找

注意

class Solution {
public:
    int GetNumberOfK(vector<int> nums ,int target) {
        int lbound = 0, rbound = 0;
        // 寻找上界
        int l = 0, r = nums.size();
        while (l < r) {
            int mid = l + (r - l) / 2;
            //上界刚好是大于target的第一个值
            if (nums[mid] < target) {
                l = mid + 1;
            }
            else {
                r = mid;
            }
        }
        lbound = l;
        // 寻找下界
        l = 0, r = nums.size();
        while (l < r) {
            int mid = l + (r - l) / 2;
            //下界刚好是等于target的第一个值
            if (nums[mid] <= target) {
                l = mid + 1;
            }
            else {
                r = mid;
            }
        }
        rbound = l;
        return rbound - lbound;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值