文章目录
题目描述
统计一个数字在排序数组中出现的次数。
示例 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;
}
};
如有帮助到您,可以多多点赞、评论鼓励哟~~~