AcWing 67. 数字在排序数组中出现的次数
原题链接
简单
作者:
adamXu
,
2020-10-09 08:05:41
,
所有人可见
,
阅读 516
class Solution {
public:
int getNumberOfK(vector<int>& nums , int k) {
//挺经典的二分,首先用第一个二分模板把区域分成[l,mid] [mid+1,r]此时最后的分界点落在
//值等于nums[mid]的最左边, 之后用第二个二分模板,把区域分成[l,mid-1],[mid,r]
//此时最后落在值等于nums[mid]的最右边,最后两个坐标相互减一下就好了,至于为啥落在
//最左最右,手动模拟一下执行过程就知道l
if(nums.empty()) return 0;
int l = 0,r = nums.size() - 1;
while(l < r){
int mid = l + r >> 1;//[l,mid][mid + 1,r]
if(nums[mid] >= k) r = mid;
else l = mid + 1;
}
if(nums[l] != k) return 0;
int left = l;
l = 0,r = nums.size() - 1;
while(l < r){
int mid = l + r + 1 >> 1;
if(nums[mid] <= k) l = mid;
else r = mid - 1;
}
return r - left + 1;
}
};