美文网首页二分
【剑指 offer】数字在排序数组中出现的次数。

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

作者: 邓泽军_3679 | 来源:发表于2019-05-05 22:22 被阅读0次

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、问题关键:

  • 如果要查找的数没有怎么办。
  • 先二分法查找最左边的,再查找最右边的。
  • 如果没有这个数,两种二分法查找的,一个小于k的最大值, 一个查找的是大于k的最小值,这两个位置差1。

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;
    }
};

相关文章

网友评论

    本文标题:【剑指 offer】数字在排序数组中出现的次数。

    本文链接:https://www.haomeiwen.com/subject/psbkoqtx.html