考察的知识点:二分查找;
解答方法分析:
- 定义变量
n
并初始化为数组weights
的长度,用于记录数组的长度。 - 初始化左边界变量
l
为 0,右边界变量r
为n - 1
。 - 通过二分查找的方式,不断更新左边界和右边界以找到目标元素的左右边界位置。具体操作如下:在每次循环中,计算中间值 mid,并与目标元素进行比较。如果 weights[mid] 小于等于目标素 target,则目标元素的左边界应在 mid 的右侧,更新右边界 r = mid - 1。如果 weights[mid] 大于目标元素 target,则目标元素的左边界应在 mid 的左侧,更新左边界 l = mid + 1。
- 重新初始化左边界变量
l
为 0,右边界变量r
为n - 1
。 - 循环结束后,记录最终的右边界位置
right
(即l - 1
)。 - 判断左界和右边界的位置关系,如果
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}; } };