题解 | #找出特定体重的牛群# java
找出特定体重的牛群
https://www.nowcoder.com/practice/bbc4c61a5bb64f329663b300a634ae6a
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param weights int整型一维数组 * @param target int整型 * @return int整型一维数组 */ public int binarySearch(int[] weights, int target, boolean lower) { int left = 0, right = weights.length - 1, ans = weights.length; while (left <= right) { int mid = (left + right) / 2; if (weights[mid] < target || (lower && weights[mid] <= target)) { right = mid - 1; ans = mid; } else { left = mid + 1; } } return ans; } public int[] searchRange(int[] weights, int target) { int leftIdx = binarySearch(weights, target, true); int rightIdx = binarySearch(weights, target, false) - 1; if (leftIdx <= rightIdx && rightIdx < weights.length && weights[leftIdx] == target && weights[rightIdx] == target) { return new int[] {leftIdx, rightIdx}; } return new int[] {-1, -1}; } }
编程语言是JAVA。
该题考察的知识点是二分查找和数组操作。
代码的文字解释如下:
- 实现
binarySearch
方法,用于在递增有序数组中查找目标元素的位置。 binarySearch
方法的输入参数为一个整型数组weights
、目标元素target
和一个布尔值lower
,用于指定是否查找第一个小于等于目标元素的位置。- 在
binarySearch
方法中,使用左右两个指针left
和right
分别表示数组的左右边界。 - 使用一个变量
ans
来记录最终的结果,初始值为数组的长度。假设目标元素不存在于数组中,则结果返回数组的长度。 - 使用
while
循环,当左指针小于等于右指针时进行迭代。 - 在循环体内,利用二分查找的思想,计算中间位置
mid
。 - 如果
weights[mid]
小于目标元素target
或者lower
为真且weights[mid]
小于等于目标元素target
,则更新右指针right
为mid - 1
,并更新结果ans
为mid
。 - 否则,更新左指针
left
为mid + 1
。 - 返回结果
ans
。 - 实现一个名为
searchRange
的方法,用于在给定递增有序数组中查找目标元素的左右边界。 searchRange
方法的输入参数为一个整型数组weights
和目标元素target
。- 调用
binarySearch
方法两次,分别查找目标元素的左边界和右边界。 - 根据返回的结果判断是否找到目标元素的左右边界,并将结果存储在一个新的整型数组中返回。
- 若未找到目标元素,则返回一个包含两个元素都为 -1 的整型数组。