解题:
1 暴力
2 双指针
3 但是我们看到升序数组,应该想到二分法
二分查找:
target=k
1 查找第一个出现的k的位置
2 查找第一个大于k的值的位置
熟练上面两种搜索的做法,要注意边界条件。
注意二分查找mid假如是left=right-1,那mid总是偏向left,因此用left去定位,right不断往left靠就可以了。所以注意
left=mid+1;
right=mid;
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int n=data.size();
if(n==0) return 0;
//二分法
//定义下界为第一个值,上界为最后一个值后一个值
int left=0,right=n;
//right必须得是data.size(),考虑data全都小于k的情况
//那么left=mid+1,最终必然走到越界
//寻找下界
while(left<right){
int mid=left+(right-left)/2;
if(data[mid]<k)
left=mid+1;
else
right=mid;
}
int lbound=left;
left=0,right=n;
//寻找上界
while(left<right){
int mid=left+(right-left)/2;
if(data[mid]<=k)
left=mid+1;
else
right=mid;
}
int rbound=left;
return rbound-lbound;
// //双指针
// int left=0,right=n-1;
// for(left;left<n;++left){
// if(data[left]==k)
// break;
// }
// for(right;right>=0;--right){
// if(data[right]==k)
// break;
// }
// return left<=right?right-left+1:0;
}
};