题解 | #找出特定体重的牛群#
找出特定体重的牛群
https://www.nowcoder.com/practice/bbc4c61a5bb64f329663b300a634ae6a
考察的知识点:二分查找;
解答方法分析:
- 定义变量
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};
}
};
查看15道真题和解析

