二分

【剑指 offer】数字在排序数组中出现的次数。

2019-05-05  本文已影响0人  邓泽军_3679

1、题目描述

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

例如输入排序数组[1, 2, 3, 3, 3, 3, 4, 5]和数字3,由于3在这个数组中出现了4次,因此输出4。

样例:

输入:[1, 2, 3, 3, 3, 3, 4, 5] , 3
输出:4

2、问题描述:

3、问题关键:

4、C++代码:

class Solution {
public:
    int getNumberOfK(vector<int>& nums , int k) {
        if (!nums.size()) return 0;
        int n = nums.size();
        int first = getFirst(nums, 0, k, n - 1);
        int last = getLast(nums, 0, k, n - 1);
        return last - first + 1;
    }
    int getFirst(vector<int>& nums, int l, int k, int r) {
        while(l < r) {
            int mid = l + r >> 1;//小于等于k的最大值。
            if (nums[mid] >= k) r = mid;
            else l = mid + 1;
        }
        return l;
    }
    int getLast(vector<int>& nums, int l, int k, int r) {
        while(l < r) {
            int mid = l + r + 1 >> 1;//大于等于k的最小值。所以找不到k的时候,last比first大1,返回的结果也是正确的。
            if (nums[mid] <= k) l = mid;
            else r = mid - 1;
        }
        return l;
    }
};
上一篇 下一篇

猜你喜欢

热点阅读