统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
限制:
0 <= 数组长度 <= 50000
链接:https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof
class Solution {
public:
int search(vector<int>& nums, int target) {
if (nums.empty()) {
return 0;
}
// (在已经排好序的数组中搜索)
// 搜索右边界 right
int i=0, j=nums.size()-1;
while (i<=j) {
// 二分查找
int m = (i+j)/2;
if (nums[m] <= target) {
// 右边界在m右侧
i = m + 1;
}
else {
// 这个主要是终止右边界的寻找
j = m - 1;
}
}
int right = i;
// 若数组中无 target ,则提前返回
if (j>=0 && nums[j] != target) {
// m索引之前的元素都<=target
// 当前m索引的前一个位置不是target,证明数组中没有此目标元素
return 0;
}
// 搜索左边界 left
i=0, j=nums.size()-1;
while (i<=j) {
// 二分查找
int m = (i+j)/2;
if (nums[m]<target) {
i = m + 1;
}
else {
// 寻找到第一个大于等于target元素的索引m,
// m-1就是其左边界
j = m -1;
}
}
int left = j;
return right-left-1;
}
};