今日份题目:
统计一个数字在排序数组中出现的次数。
示例1
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例2
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
提示
-
0 <= nums.length <= 10^5
-
-10^9 <= nums[i] <= 10^9
-
nums
是一个非递减数组 -
-10^9 <= target <= 10^9
题目思路
使用两次二分查找找到target在数组中的左右边界,然后长度就是右边界减去左边界再加一,最后返回长度即可。
代码
class Solution
{
public:
int binarySearch(vector<int>& nums, int target, bool lower)
{//二分查找,lower为true表示查找第一个大于等于target的下标(左端点),为false表示查找第一个大于target的下标(右端点)
int left=0,right=nums.size()-1,ans=nums.size();
while(left<=right)
{
int mid=(left+right)/2;
if(nums[mid]>target||(lower&&nums[mid]>=target))
{//需要移到左半部分继续二分查找
right=mid-1;
ans=mid;
}
else //需要移到右半部分继续二分查找
{
left=mid+1;
}
}
return ans;
}
int search(vector<int>& nums, int target)
{
int l=binarySearch(nums,target,true);//二分查找左端点
int r=binarySearch(nums,target,false)-1;//二分查找右端点
if(l<=r&&r<nums.size()&&nums[l]==target&&nums[r]==target)
{//如果存在这样的全是target这个数的区间,并且未超出nums范围,并且确定区间内的数都是target
return r-l+1;
}
return 0;//不符合返回0
}
};
提交结果
欢迎大家在评论区讨论,如有不懂的代码部分,欢迎在评论区留言!