考察的知识点:二分查找;

解答方法分析:

  1. 定义变量 n 并初始化为数组 weights 的长度,用于记录数组的长度。
  2. 初始化左边界变量 l 为 0,右边界变量 r 为 n - 1
  3. 通过二分查找的方式,不断更新左边界和右边界以找到目标元素的左右边界位置。具体操作如下:在每次循环中,计算中间值 mid,并与目标元素进行比较。如果 weights[mid] 小于等于目标素 target,则目标元素的左边界应在 mid 的右侧,更新右边界 r = mid - 1。如果 weights[mid] 大于目标元素 target,则目标元素的左边界应在 mid 的左侧,更新左边界 l = mid + 1。
  4. 重新初始化左边界变量 l 为 0,右边界变量 r 为 n - 1
  5. 循环结束后,记录最终的右边界位置 right(即 l - 1)。
  6. 判断左界和右边界的位置关系,如果 left 大于 right,则说明目标元素不存在,返回数组 {-1, -1};否则,返回数组 {left, right}

所用编程语言:C++;

完整编程代码:↓

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param weights int整型vector
     * @param target int整型
     * @return int整型vector
     */
    vector<int> searchRange(vector<int>& weights, int target) {
        int n = weights.size();
        int l = 0, r = n - 1;
        while (l <= r) {
            int mid = (l + r) / 2;
            if (weights[mid] <= target) {
                r = mid - 1;
            } else if (weights[mid] > target) {
                l = mid + 1;
            }
        }
        int left = r + 1;
        l = 0;
        r = n - 1;
        while (l <= r) {
            int mid = (l + r) / 2;
            if (weights[mid] >= target) {
                l = mid + 1;
            } else if (weights[mid] < target) {
                r = mid - 1;
            }
        }
        int right = l - 1;
        return left > right ? vector<int> {-1, -1} : vector<int> {left, right};
    }
};