LCR 172. 统计目标成绩的出现次数(二分查找)

文章介绍了如何利用二分查找法解决在一个非严格递增的整数数组中,统计目标值出现的次数问题,通过查找目标值的右边界和比目标值小1的值的右边界来计算次数。
摘要由CSDN通过智能技术生成

某班级考试成绩按非严格递增顺序记录于整数数组 scores,请返回目标成绩 target 的出现次数。

示例 1:

输入: scores = [2, 2, 3, 4, 4, 4, 5, 6, 6, 8], target = 4
输出: 3

示例 2:

输入: scores = [1, 2, 3, 5, 7, 9], target = 6
输出: 0

提示:

  • 0 <= scores.length <= 105
  • -109 <= scores[i] <= 109
  • scores 是一个非递减数组
  • -109 <= target <= 109

思路: 

1、有序数组查找目标值采用二分查找。

2、因为需要查找目标值出现的次数,我们可以通过查找目标值的右边界和左边界,相减即可的结果。

3、比如数组[1,2,3,3,4],我们查找3出现的次数,可以通过查找右边界4的下标和以(target-1)为目标值查找出的右边界也就是2的右边界,第一个3的下标,通过相减即可得出3出现了几次。

代码实现: 

 

class Solution {
public:
    int binarySearch(vector<int>& scores, int target)
    {
        int size = scores.size();
        if(size == 0)
            return 0;
        int low = 0, high = size - 1;
        while(low <= high)
        {
            int mid = low + (high - low) / 2;
            if(scores[mid] <= target)           //此处的等于号就是为了找到target的右边界
                low = mid + 1;
            else
                high = mid - 1;
        }
        return low;
    }
    int countTarget(vector<int>& scores, int target) {
        return binarySearch(scores, target) - binarySearch(scores, target - 1);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值