[剑指Offer]:在排序数组中查找数字

120 阅读1分钟

文章目录


题目描述

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

示例 1:

输入: nums = [5,7,7,8,8,10], target = 8
输出: 2

示例 2:

输入: nums = [5,7,7,8,8,10], target = 6
输出: 0

题解思路

方法一:遍历数组

思路不讲武德。

代码实现:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int count = 0;

        for (int i : nums) {
            if (target == i) {
                ++count;
            }
        }

        return count;
    }
};

方法二:hashmap

用 hashmap 来统计 nums 中元素出现的次数。

代码实现:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        unordered_map<int, int> m;
        for(int i : nums){
            m[i]++;
        }
        return m[target];
    }
};

方法三:利用函数 lower_bound 与 upper_bound

一次lower_bound求出大于等于target的下界,一次upper_bound求出大于target的下界,然后两个索引相减即可。

代码实现:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        auto l=lower_bound(nums.begin(),nums.end(),target);
        auto r=upper_bound(nums.begin(),nums.end(),target);
        return r-l;
    }
};

方法四:二分法

代码实现:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        if(nums.size() == 0) return 0;

        int count = 0, l = 0, r = nums.size();
        while(l < r){
            int mid = l + (r - l) / 2;

            if(nums[mid] >= target) r = mid;
            else l = mid +1;
        }
        
        for(int i = l; i < nums.size(); ++i){
            if(nums[i] == target) ++count;
            else break;
        }
        return count;
    }
};

如有帮助到您,可以多多点赞、评论鼓励哟~~~