1.二分查找
第一种:
(1)lo <= hi
(2)lo = mi + 1
(3)hi = mi -** 1
第二种:
(1)lo < hi
(2)lo = mi + 1
(3)hi = mi;
这种最后还需要判断一次 return target == nums[lo] ? lo : -1;
2.二分查找完,再在前后找到所有数字
int GetNumberOfK(vector<int> data ,int k) {if(data.empty())return 0;if(k < data[0] || k > data[data.size()-1])return 0;int lo = 0, hi = data.size() - 1;int mi;while(lo <= hi){mi = (hi - lo) >> 1 + lo;if(k == data[mi])break;else if(k < data[mi]){hi = mi - 1;}else{lo = mi + 1;}}int cnt = 0;for(int i = mi;i < data.size();i++){if(data[i] != k)break;cnt++;}for(int i = mi - 1;i >= 0;i--){if(data[i] != k)break;cnt++;}return cnt;}
2.两次二分查找
int GetNumberOfK(vector<int> data ,int k) {
if(data.empty())return 0;
int lo = 0, hi = data.size() - 1, mi;
while(lo <= hi){
mi = ((hi - lo) >> 1) + lo;
if(data[mi] >= k)hi = mi - 1;
else lo = mi + 1;
}
int left = lo;
lo = 0;
hi = data.size() - 1;
while(lo <= hi){
mi = ((hi - lo) >> 1) + lo;
if(data[mi] > k)hi = mi - 1;
else lo = mi + 1;
}
int right = hi;
return (data[left] == k) ? (right - left + 1) : 0;
}
