剑指Offer——JZ37.数字在排序数组中出现的次数【二分】

题目传送门


在这里插入图片描述


题解

  • 遍历一遍真的是太不优美(sb)了
  • 有序数组嘛,闭着眼睛都知道是二分→_→
  • 找到两个位置
    1. 第一个>=k的位置
    2. 第一个>k的位置
      剑指Offer——JZ37.数字在排序数组中出现的次数【二分】_第1张图片

AC-Code

class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
//        return solve(data, k);
        auto lindex = lower_bound(data.begin(), data.end(), k);
        auto rindex = upper_bound(data.begin(), data.end(), k);
        return rindex - lindex;
    }
    int solve(vector<int> data ,int k) {
        int L = 0, R = data.size();
        int lindex, rindex;
        while(L < R) {    // 下界
            int mid = (L + R) >> 1;
            if(data[mid] < k)
                L = mid + 1;
            else
                R = mid;
        }
        lindex = L;
        L = 0, R = data.size();
        while(L < R) {    // 上界
            int mid = (L + R) >> 1;
            if(data[mid] <= k)
                L = mid + 1;
            else
                R = mid;
        }
        rindex = R;
        return rindex - lindex;
    }
};

你可能感兴趣的:(剑指Offer)