题目:
统计一个数字在排序数组中出现的次数。
class Solution {
/*
方法一算是我第二次写,错误的地方就是在while循环里没写 return count
导致一直循环出不来,当在 mid == target 之后,满足条件要及时返回啊
这个是方法二的主要思想
容易想到的方式就是分别用二分查找的方式去查找 target 在数组的左边界和右边界,
然后将右边界减左边界即可得到结果
分别查找 target 左边界和右边界的逻辑会有差异,这里可以取巧,
变成分别查找 target-1 的右边界和 target 的右边界,结果是一样的,但是代码可以进行复用了
*/
public:
// // 方法一:
// int search(vector<int>& nums, int target)
// {
// int left = 0, right = nums.size();
// int count = 0;
// while(left < right)
// {
// int mid = left + ((right - left) >> 1);
// if(nums[mid] > target) right = mid;
// else if(nums[mid] < target) left = mid + 1;
// else
// {
// int start = mid, end = mid + 1;
// while(start >= 0 && nums[start] == target)
// {
// count++;
// start--;
// }
// while(end < nums.size() && nums[end] == target)
// {
// count++;
// end++;
// }
// return count;
// }
// }
// return count;
// }
// 方法二:
int search(vector<int>& nums, int target)
{
// 找到第一个 大于或等于 target 的下标
return comNums(nums, target) - comNums(nums, target - 1);
}
// 其实这个函数相当于 lower_bound 返回nums数组中第一个 大于或等于 target 的下标
int comNums(vector<int>& nums, int target)
{
int left = 0, right = nums.size();
while(left < right)
{
int mid = left + ((right - left) / 2);
if(nums[mid] > target) right = mid;
else left = mid + 1;
// else return mid;
}
return left;
}
};