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.二分查找完,再在前后找到所有数字

  1. int GetNumberOfK(vector<int> data ,int k) {
  2. if(data.empty())return 0;
  3. if(k < data[0] || k > data[data.size()-1])return 0;
  4. int lo = 0, hi = data.size() - 1;
  5. int mi;
  6. while(lo <= hi){
  7. mi = (hi - lo) >> 1 + lo;
  8. if(k == data[mi])break;
  9. else if(k < data[mi]){
  10. hi = mi - 1;
  11. }else{
  12. lo = mi + 1;
  13. }
  14. }
  15. int cnt = 0;
  16. for(int i = mi;i < data.size();i++){
  17. if(data[i] != k)break;
  18. cnt++;
  19. }
  20. for(int i = mi - 1;i >= 0;i--){
  21. if(data[i] != k)break;
  22. cnt++;
  23. }
  24. return cnt;
  25. }

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;
    }