题目描述
统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
链接: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;
int l=0,r=nums.size()-1;
int res;
while(l<r)//最小位置
{
int mid=(l+r)>>1;
if(nums[mid]<target) l=mid+1;
else r=mid;
}
int left=l;
if(nums[l]!=target) return 0;
l=0,r=nums.size()-1;
while(l<r)//最大位置
{
int mid=(l+r+1)>>1;
if(nums[mid]<=target) l=mid;
else r=mid-1;
}
int right=r;
return right-left+1;
}
};